当前位置:首页 > C语言常考编程指导
全国计算机二级C常考算法编程指导
1. 变量交换
void swap(int *x, int *y) { int temp;
temp=*x; *x=*y; *y=temp; }
2.累加
用C语言实现1+2+3+4+5+?+n的累加。 【方法1】while循环实现 int add(int n) { int i,sum; sum=0; i=1; while(i<=n)
{ sum=sum+i; i=i+1; } return sum; }
main()
{ int s,n;
printf(\ scanf(\
s=add(n); /*函数调用*/ printf(\}
【方法2】for循环实现(main函数同上) int add(int n) { int i,sum=0;
for(i=1;i<=n;i++) sum=sum+i; return sum; }
do-while循环也可以实现累加,请读者自己完成。
3.累乘
用C语言求n的阶乘:n! = 1′2′3′4′?′n (n≥1) int product (int n) { int i,p=1;
for(i=2;i<=n;i++) p=p*i; return p; }
如果n的值比较大,函数返回值和存放乘积的变量p应定义为long或者double型。
1 / 16
4.排序
(1)冒泡排序
void BubbleSort(int a[],int n) { int i,j, tmp;
for(i=0;i if(a[j]>a[j+1]) /*从小到大,升序*/ { tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp;}/*交换a[j]与a[j+1],大数后移*/ } } (2)选择排序 void SelectSort(int a[],int n) { int i,j,min,tmp; for(i=0; i { min=i; /*假设第一个数最小,记录其下标*/ for(j=i+1; j if(a[j] { tmp=a[i]; a[i]=a[min]; a[min]=tmp; }/*将最小的数与第一个数进行交换*/ } } (3)插入排序 void InsertSort(int a[],int n) { int i,j,tmp; for(i=1; i { tmp=a[i]; /* 空出a[i]单元 */ for(j=i-1; j>=0 && a[j]>tmp; j--) a[j+1]=a[j]; /* 大于tmp的数向后移位 */ a[j+1]=tmp; /* tmp归位 */ } } 5.归并(合并) 将两个有序数组A、B合并成另一个有序的数组C(升序或降序)。升序合并步骤如下: ① 先在A、B数组中各取第一个元素进行比较,将小的元素放入C中。 ② 取小的元素所在数组的下一个元素与另一个数组中上次比较后较大的元素进行比较。 ③ 重复上述比较过程,直到某个数组被先排完。 ④ 将另一个数组剩余元素抄入C中,合并排序完成。 void merge(int a[],int m,int b[n],int n,int c[]) 2 / 16 { int ia=0,ib=0,ic=0; while(ia { if (a[ia] else { c[ic]=b[ib];ib++; } ic++; } while(ia 6.查找 (1)线性法查找 线性法查找也叫顺序查找,对于没有排序的数组,只能采用线性法查找。 将x与数组中的各个元素从头到尾进行比较,找到后返回数组下标,若找不到,返回-1。 #define N 10 int find(int a[N],int key) { int i; for(i=0; i if(a[i]==key) { return (i); break; }数组元素下标*/ if(i==N) return (-1); } 如果对一个升序数组进行线性法查找,循环结束条件改为“i int find(int a[N],int key) { int m,p,q; p=0;q=N-1; /*p为第1个元素的下标,q为最后一个元素的下标*/ while(p<=q) { m=(p+q)/2; /*m为中间元素的下标*/ if (a[m]==key) { return (m); break;} else if(key if (p>q) return (-1); } 3 / 16 7.级数计算(递推法) 递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。简单地说,就是后一项的值利用前面已求得的项的值得到,典型的递推算法如Fibonacci数列(斐波那契数列),后一项为前两项的和。基本操作中的累加与累乘都可以看作递推法。 包括两部分:开始项的值,以及从前面一、两项得到下一项的计算方法。用递推式比通项公式算得要快,因为计算每一项都充分利用了前一项的计算结果。 例如,有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,?求出这个数列的前20项之和。 8.求最大、最小值 (1)查找一维数组a[ ]中的最大值,n为数组的大小 int funmax (int a[], int n) { int i,max=a[0]; for(i=1;i if(max>a[i]) max=a[i]; return max; } (2)查找二维数组a中的最小值 有一个3×4的矩阵,求所有元素的最小值及该元素的行号列号。因为函数只能返回一个值,要想得到最小元素的行号和列号,需要用指针作函数的参数。 int funmin(int a[][4], int *min_i,int *min_j) { int i,j,min; min=a[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if(a[i][j] { min=a[i][j]; *min_i=i; *min_j=j; } return min; } main() { int i,j,min,min_i,min_j,a[3][4]={{3,6,9,12},{2,8,4,6},{5,7,9,10}}; min=funmin(a,&min_i,&min_j); printf(\} 运行结果为:min=2,min_i=1,mim_j=0 二维数组作函数的参数,第一维的长度可以缺省,第二维的长度不能缺省。 9.求和及平均值 求数组的平均值,先用循环将数组的所有元素相加,最后返回所得的和除以数组元素的个数。 float average(int a[],int n) { int i; float avg; avg=0; for(i=0;i return avg/n; /*若求数组的和,则返回avg,最好将avg变量用sum表示*/ } 4 / 16
共分享92篇相关文档