您的当前位置:首页正文

常用c语言程序

2023-10-09 来源:钮旅网
常用c语言程序

算法( Algorithm ):计算机解题的基本思想方法和步骤。算法的描绘:是对要解决一个问题或要达成一项任务所采纳的方法和步骤的描绘, 包含需要什么数据(输入什么数据、输出什么结果)、采纳什么构造、使用什么语句以及怎样安排这些语句等。往常使用自然语言、构造化流程图、伪代码等来描绘算法。

一、计数、乞降、求阶乘等简单算法

此类问题都要使用循环, 要注意依据问题确立循环变量的初值、 终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。

例:用随机函数产生 100 个 [0 ,99] 范围内的随机整数,统计个位上的数字分别为 1, 2,3,4,5,6,7,8,9,0 的数的个数并打印出来。

此题使用数组来办理,用数组 a[100] 寄存产生确实 100 个随机整数,数组 x[10] 来寄存个位上的数字分别为 1, 2, 3, 4,5,6,7,8,9,0 的数的个数。即个位是 1 的个数寄存在 x[1] 中,个位是 2 的个数寄存在 x[2] 中, 个位是 0 的个数寄存在 x[10] 。

void main()

{ int a[101],x[11],i,p; for(i=0;i<=11;i++) x[i]=0;

for(i=1;i<=100;i++) { a[i]=rand() % 100; printf(\"%4d\

if(i%10==0)printf(\"\\n\"); }

for(i=1;i<=100;i++) { p=a[i]%10; if(p==0) p=10; x[p]=x[p]+1; }

for(i=1;i<=10;i++) { p=i;

if(i==10) p=0;

printf(\"%d,%d\\n\}

printf(\"\\n\"); }

二、求两个整数的最大条约数、最小公倍数

剖析:求最大条约数的算法思想: ( 最小公倍数 =两个整数之积 / 最大条约数 ) (1) 关于已知两数 m,n,使得 m>n; (2) m 除以 n 得余数 r ;

1 / 13

常用c语言程序

(3) 若 r=0 ,则 n 为求得的最大条约数,算法结束;不然履行 (4) m ←n,n←r ,再重复履行 (2) 。

比如 : 求 m=14 ,n=6 的最大条约数 . m n r 1462 6 2 0

void main() { int nm,r,n,m,t;

printf(\"please input two numbers:\\n\"); scanf(\"%d,%d\nm=n*m; if (m{ t=n; n=m; m=t; } r=m%n; while (r!=0)

{ m=n; n=r; r=m%n; }

printf(\" 最大条约数 :%d\\n\printf(\" 最小公倍数 :%d\\n\}

三、判断素数

(4) ;

只好被 1 或自己整除的数称为素数 基本思想:把 m作为被除数,将 2— INT ( )作为除数,假如都除不尽, m 就是素数,不然就不是。(可用以下程序段实现)

void main() { int m,i,k;

printf(\"please input a number:\\n\"); scanf(\"%d\k=sqrt(m); for(i=2;i=k)

printf(\" 该数是素数 \"); else

printf(\" 该数不是素数 \"); }

将其写成一函数 , 若为素数返回 1,不是则返回 0 int prime( m%) {int i,k; k=sqrt(m); for(i=2;iif(m%i==0) return 0; return 1; }

2 / 13

常用c语言程序

四、考证哥德巴赫猜想

(随意一个大于等于 6 的偶数都能够分解为两个素数之和)

基本思想: n 为大于等于 6 的任一偶数,可分解为 n1 和 n2 两个数,分别检查 n1 和 n2 能否为素数,如都是,则为一组解。如 n1 不是素数,就不用再检查 n2 能否素数。先从 n1=3 开始,查验 n1 和 n2(n2=N-n1)能否素数。而后使 n1+2 再查验 n1、n2 能否素数, 直到 n1=n/2 为止。

利用上边的 prime 函数,考证哥德巴赫猜想的程序代码以下:

#include \"math.h\" int prime(int m) { int i,k; k=sqrt(m); for(i=2;i=k) return 1; else return 0; }

main() { int x,i;

printf(\"please input a even number(>=6):\\n\"); scanf(\"%d\if (x<6||x%2!=0)

printf(\"data error!\\n\"); else

for(i=2;i<=x/2;i++)

if (prime(i)&&prime(x-i)) {

printf(\"%d+%d\\n\printf(\" 考证成功 !\"); break; } }

五、排序问题

1.选择法排序(升序)

基本思想: 1)对有 n 个数的序列(寄存在数组 a(n)

中),从中选出最小的数,与第互换地点;

3 / 13

1 个数

常用c语言程序

2)除第 1 个数外,其他 n-1 个数中选最小的数,与第 2 个数互换地点; 3)挨次类推,选择了 n-1 次后,这个数列已按升序摆列。 程序代码以下: void main()

{ int i,j,imin,s,a[10];

printf(\"\\n input 10 numbers:\\n\"); for(i=0;i<10;i++) scanf(\"%d\for(i=0;i<9;i++) { imin=i;

for(j=i+1;j<10;j++) if(a[imin]>a[j]) imin=j; if(i!=imin)

{s=a[i]; a[i]=a[imin]; a[imin]=s; } printf(\"%d\\n\} }

2.冒泡法排序(升序)

基本思想: ( 将相邻两个数比较,小的调到前头 )

1)有 n 个数(寄存在数组 a(n) 中),第一趟将每相邻两个数比较,小的调到前头,经 n-1 次两两相邻比较后,最大的数已“沉底”,放在最后一个地点,小数 上涨“浮起”;

n-2 次两 2)第二趟对余下的 n-1 个数(最大的数已“沉底”)按上法比较,经

两相邻比较后得次大的数;

3)挨次类推, n 个数共进行 n-1 趟比较,在第 j 趟中要进行 n-j 次两两比较。程序段以下 void main() { int a[10]; int i,j,t;

printf(\"input 10 numbers\\n\"); for(i=0;i<10;i++)

scanf(\"%d\for(j=0;j<=8;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1])

{t=a[i];a[i]=a[i+1];a[i+1]=t;}

printf(\"the sorted numbers:\\n\"); for(i=0;i<10;i++) printf(\"%d\\n\

}

4 / 13

常用c语言程序

3.归并法排序(将两个有序数组 A、B 归并成另一个有序的数组 C,升序)

基本思想:

1)先在 A、B 数组中各取第一个元素进行比较,将小的元素放入

C 数组;

2)取小的元素所在数组的下一个元素与另一数组中上一次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;

3)将另一个数组节余元素抄入 C 数组,归并排序达成。 程序段以下: void main()

{ int a[10],b[10],c[20],i,ia,ib,ic;

printf(\"please input the first array:\\n\"); for(i=0;i<10;i++) scanf(\"%d\for(i=0;i<10;i++) scanf(\"%d\printf(\"\\n\"); ia=0;ib=0;ic=0;

while(ia<10&&ib<10) { if(a[ia]{ c[ic]=b[ib];ib++;} ic++; }

while(ia<=9) { c[ic]=a[ia]; ia++;ic++; }

while(ib<=9) { c[ic]=b[ib]; b++;ic++; }

for(i=0;i<20;i++) printf(\"%d\\n\}

六、查找问题

1.①次序查找法(在一列数中查找某数

x)

基本思想:一列数放在数组 a[1]---a[n] 中,待查找的数放在 x 中,把 x 与 a 数组中的元素从头至尾一一进行比较查找。用变量 p 表示 a 数组元素下标,

p 初值为 1,使 x 与 a[p] 比较,假如 x 不等于 a[p] ,则使 p=p+1,不停重复这个过程;一旦 x 等于 a[p] 则退出循环;此外,假如 p 大于数组长度,循环也应当停止。(这个过程可由下语句实现)

5 / 13

常用c语言程序

void main() { int a[10],p,x,i;

printf(\"please input the array:\\n\"); for(i=0;i<10;i++) scanf(\"%d\

printf(\"please input the number you want find:\\n\"); scanf(\"%d\printf(\"\\n\"); p=0;

while(x!=a[p]&&p<10) p++; if(p>=10)

printf(\"the number is not found!\\n\"); else

printf(\"the number is found the no%d!\\n\}

思虑:将上边程序改写一查找函数 Find ,若找到则返回下标值,找不到返回 -1 ②基本思想:一列数放在数组 a[1]---a[n] 中,待查找的重点值为 key,把 key

与 a 数组中的元素从头至尾一一进行比较查找,若同样,查找成功,若找不到,则查找失败。 ( 查找子过程以下。 index :寄存找到元素的下标。 ) void main()

{ int a[10],index,x,i; printf(\"please input the array:\\n\"); for(i=0;i<10;i++) scanf(\"%d\

printf(\"please input the number you want find:\\n\"); scanf(\"%d\printf(\"\\n\"); index=-1;

for(i=0;i<10;i++) if(x==a[i])

{ index=i; break; }

if(index==-1)

printf(\"the number is not found!\\n\"); else

printf(\"the number is found the no%d!\\n\}

2.折半查找法(只好对有序数列进行查找)

基本思想:设 n 个有序数(从小到大)寄存在数组 a[1]----a[n] 中,要查

找的数为 x。用变量 bot 、top 、mid 分别表示查找数据范围的底部 (数组下界)、顶部(数组的上界)和中间, mid=(top+bot)/2 ,折半查找的算法以下:

6 / 13

常用c语言程序

( 1) x=a(mid) ,则已找到退出循环,不然进行下边的判断; ( 2) xa(mid) ,x 必然落在 mid+1 和 top 的范围以内,即 bot=mid+1 ; ( 4)在确立了新的查找范围后,重复进行以上比较,直到找到或许 将上边的算法写成以下程序: void main() {

int a[10],mid,bot,top,x,i,find;

printf(\"please input the array:\\n\"); for(i=0;i<10;i++) scanf(\"%d\

printf(\"please input the number you want find:\\n\"); scanf(\"%d\printf(\"\\n\");

bot=0;top=9;find=0;

while(botbot=mid+1; }

if (find==1)

printf(\"the number is found the no%d!\\n\else

printf(\"the number is not found!\\n\"); }

七、插入法

把一个数插到有序数列中,插入后数列仍旧有序

基本思想: n 个有序数(从小到大)寄存在数组 a(1) —a(n) 中,要插入的数x。第一确立 x 插在数组中的地点 P;(可由以下语句实现) #define N 10

void insert(int a[],int x) { int p, i; p=0;

while(x>a[p]&&pfor(i=N; i>p; i--) a[i]=a[i-1]; a[p]=x;

7 / 13

bot<=top 。

常用c语言程序

}

main()

{ int a[N+1]={1,3,4,7,8,11,13,18,56,78}, x, i; for(i=0; ifor(i=0; i<=N; i++) printf(\"%d,\printf(\"\\n\"); }

八、矩阵(二维数组)运算

( 1)矩阵的加、减运算 C(i,j)=a(i,j)+b(i,j)加法 C(i,j)=a(i,j)-b(i,j) 减法 ( 2)矩阵相乘

(矩阵 A 有 M*L 个元素,矩阵 B 有 L*N 个元素,则矩阵 C=A*B有 M*N个元素)。矩阵 C 中任一元素 (i=1,2, ,m; j=1,2, ,n) #define M 2

#define L 4 #define N 3

void mv(int a[M][L], int b[L][N], int c[M][N]) { int i, j, k; for(i=0;

i} }

main()

{ int a[M][L]={{1,2,3,4},{1,1,1,1}};

int b[L][N]={{1,1,1},{1,2,1},{2,2,1},{2,3,1}}, c[M][N]; int i, j; mv(a,b,c);

for(i=0; i( 3)矩阵传置

例 : 有二维数组 a(5,5) ,要对它实现转置,可用下边两种方式:

8 / 13

常用c语言程序

#define N 3

void ch1(int a[N][N]) { int i, j, t; for(i=0; ia[i][j]=a[j][i]; a[j][i]=t; } }

void ch2(int a[N][N]) { int i, j, t; for(i=1; imain()

{ int a[N][N]={{1,2,3},{4,5,6},{7,8,9}}, i, j; ch1(a); /* 或 ch2(a);*/ for(i=0; i( 4)求二维数组中最小元素及其所在的行和列

基本思路同一维数组,可用下边程序段实现(以二维数组 a[3][4] 为例):‘变量 max中寄存最大值, row,column 寄存最大值所在队列号 #define N 4 #define M 3

void min(int a[M][N])

{ int min, row, column, i, j; min=a[0][0]; row=0; column=0;

for(i=0; i9 / 13

常用c语言程序

}

printf(\"Min=%d\\nAt Row%d,Column%d\\n\}

main()

{ int a[M][N]={{1,23,45,-5},{5,6,-7,6},{0,33,8,15}}; min(a); }

九、迭代法

算法思想:关于一个问题的求解 x,可由给定的一个初值 x0,依据某一迭代公式获得一个新的值 x1,这个新值 x1 比初值 x0 更靠近要求的值 x;再以新值作为初值,即: x1→x0, 从头按本来的方法求 x1, 重复这一过和直到 |x1- x0|< ε( 某一给定的精度 ) 。此时可将 x1 作为问题的解。

例:用迭代法求某个数的平方根。 已知求平方根的迭代公式为: #include float fsqrt(float a) { float x0, x1; x1=a/2; do{ x0=x1;

x1=0.5*(x0+a/x0); }while(fabs(x1-x0)>0.00001); return(x1);

}

main() { float a;

scanf(\"%f\

printf(\"genhao =%f\\n\}

十、数制变换

将一个十进制整数 m变换成 →r(2 - 16) 进制字符串。

方法:将 m不停除 r 取余数,直到商为零,以反序获得结果。下边写出一 变换函数,参数 idec 为十进制数, ibase 为要变换成数的基 (如二进制的基是 2,八进制的基是 8 等),函数输出结果是字符串。 char *trdec(int idec, int ibase) { char strdr[20], t; int i, idr, p=0; while(idec!=0) { idr=idec % ibase;

if(idr>=10)

strdr[p++]=idr-10+65;

10 / 13

常用c语言程序

else

strdr[p++]=idr+48; idec/=ibase; }

for(i=0; i

strdr[i]=strdr[p-i-1]; strdr[p-i-1]=t; }

strdr[p]= ’ 0’; return(strdr); }

main()

{ int x, d; scanf(\"%d%d\&x, &d); printf(\"%s\\nrdec(x,d)); }

十一、字符串的一般办理

1.简单加密和解密

加密的思想是: 将每个字母 C 加(或减)一序数 K,即用它后的第 K 个字母代

替,变换式公式: c=c+k

比如序数 k 为 5,这时 A→ F , a→f ,B→?G 当加序数后的字母超出 Z 或 z

则 c=c+k -26

比如: You are good → Dtz fwj ltti

解密为加密的逆过程

将每个字母 C 减(或加)一序数 K,即 c=c-k, 比如序数 k 为 5,这时 Z→U,z→u,Y→T 当加序c=c-k 数后的字母小于 A或 a 则 +26

下段程序是加密办理: #include char *jiami(char stri[]) { int i=0;

char strp[50],ia; while(stri[i]!= ’ 0’) { if(stri[i]>= ’A’&&stri[i]<= ’Z’) { ia=stri[i]+5;

if (ia> ’Z’) ia -=26; }

else if(stri[i]>= ’a’&&stri[i]<= ’z’) { ia=stri[i]+5;

if (ia> ’z’) ia -=26; }

11 / 13

常用c语言程序

else ia=stri[i]; strp[i++]=ia; }

strp[i]= ’ 0’; return(strp); }

main()

{ char s[50]; gets(s); printf(\"%s\\n\

}

2.统计文本单词的个数

输入一行字符,统计此中有多少个单词,单词之间用格分分开。算法思路:

( 1)从文本(字符串)的左侧开始,拿出一个字符;设逻辑量 word 表示所取字符是不是单词内的字符,初值设为 0 ( 2)若所取字符不是“空格”,“逗号”,“分号”或“叹息号”等单词的分

隔符,再判断 word 能否为 1,若 word 不为 1 则表是新单词的开始, 让单词数 num = num +1 ,让 word =1; ( 3)若所取字符是“空格”,“逗号”,“分号”或“叹息号”等单词的分开符, 则表示字符不是单词内字符,让 word=0;

(4) 再挨次取下一个字符,重得( 2)(3) 直到文本结束。下边程序段是字符串 string 中包含的单词数 #include \"stdio.h\" main()

{char c,string[80]; int i,num=0,word=0; gets(string);

for(i=0;(c=string[i])!='\\0';i++) if(c==' ') word=0; else if(word==0) { word=1; num++;}

printf(\"There are %d word in the line.\\n\}

十二、穷举法

穷举法(又称“列举法”)的基本思想是:一一列举各样可能的状况,并判 断哪一种可能是切合要求的解, 这是一种“在没有其他方法的状况的方法”, 是 一种最“笨”的方法, 但是对一些没法用分析法求解的问题常常能见效, 往常采 用循环来办理穷举问题。

例: 将一张面值为 100 元的人民币等值换成 100 张 5 元、 1 元和 0.5 元的零钞,要求每种零钞许多于 1 张,问有哪几种组合?

12 / 13

常用c语言程序

main() { int i, j, k; printf(\" 5 元 1 元 5 角\\n\"); for(i=1; i<=20; i++) for(j=1; j<=100-i; j++) { k=100-i-j;

if(5*i+1*j+0.5*k==100)

printf(\" %3d %3d %3d\\n\} }

十三、递归算法

用自己的构造来描绘自己,称递归

VB 同意在一个 Sub 子过程和 Function 过程的定义内部调用自己, 即递归 Sub 子过程和

递归 Function 函数。递归办理一般用栈来实现,每调用一次自己,把目前参数压栈,直到递归纳束条件;而后从栈中弹出目前参数,直到栈空。

递归条件:( 1)递归纳束条件及结束时的值; (2)能用递归形式表示,且递归向停止条件发展。

例:编 fac(n)=n! 的递归函数 int fac(int n) { if(n==1) return(1); else return(n*fac(n-1)); } main()

{ int n; scanf(\"%d\printf(\"n!=%d\\n\fac(n)); }

13 / 13

因篇幅问题不能全部显示,请点此查看更多更全内容