算法( 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 { 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 printf(\" 该数是素数 \"); else printf(\" 该数不是素数 \"); } 将其写成一函数 , 若为素数返回 1,不是则返回 0 int prime( m%) {int i,k; k=sqrt(m); for(i=2;i 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 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语言程序