本试卷完成时间为70分钟,其中改错题(16分),很容易拿到手。
一、 改错题(16分)
【程序功能】
函数factor的功能是求出正整数m(m>2)除自身以外的所有不同因子,将这些因子按从小到大的顺序存放到fac指向的数组中,将因子个数保存到n指向的变量中,函数返回因子之和。
算法提示:用m 分别除以 2,3,4,…,(int)sqrt(m),若相除得到两个互异因子,则小者存入fac指向数组的左端,大者存入fac指向数组的右端。若相除得到两个相同因子,则将该因子存入fac指向数组的左端。当求出全部因子后,将所有因子按从小到大的顺序集中存放在 fac指向数组的左端。
【测试数据与运行结果】
测试数据:m=32
屏幕输出:Sum:31
Number:5
factors: 1 2 4 8 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <stdio.h> #include <math.h> #define N 100 long factor(int m,int *fac,int *n) { int right,left,k=(int)sqrt(m),i; long sum; *fac=1; *n=1; right=N-1; left=1; sum=1; i=2; while(i<k) { k=m/i; if(k*i=m) { if(i!=k) { *n+=2; sum=i+k; fac[left++]=i; fac[right--]=k; } else { *n+=1; sum+=i; fac[left++]=i; } } i++; } for(i=right; i<=N-1; i++) fac[left++]=fac[i]; return sum; } void main() { int fac[N]= {0},i,m,num; long sum; printf("Input m(>2):"); scanf("%d",&m); sum=factor(m,fac,*num); printf("\nSum:%ld\n",sum); printf("Number:%d\n",num); printf("factors:"); for(i=0; i<num; i++) printf("%6d",fac[i]); } |
【要求】
1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。
3. 改正后的程序(文件名myf1.c)保存在T:盘根目录中供阅卷使用,否则不予评分。