2023年C改错题例题.docx
2023年C改错题例题 类型A:素数 A 1、下面的程序是求400以内的所有的素数之和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果。 #include #include #include int prime(int n) int yes, i; if(n yes=1; /*原来的代码: for(i=2; i if(n%i=0) yes=0; break; return yes; main() int sum=0, i; clrscr(); for(i=2;i if(prime(i) sum+=i; printf("%dn", sum); yes=0 */ /*原来的代码: yes=1 */ A 2、下面的程序是求1000以内的最大的20个素数之和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果。18580 #include #include #include int fun(int high) int sum=0, n=0, j, yes; while(high>=2) &&(n /*原来的代码: while(high>=2) |(n yes=1 ; for(j=2; j if(high%j=0) yes=0; break; /*原来的代码: yes=0; break; 忘了大括号 */ if(yes) sum+=high;n+; high-; return sum; main() clrscr(); printf("%d n",fun(1000); 类型B:完数,多因子完备数 B 1、若某个整数N的所有因子之和等于N的倍数,则称N为多因子完备数。例如,28是多因子完备数。因为:1+2+4+7+14+28=56=28*2 ,下面程序求150,1000间有多少个多因子完备数,请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。 #include #include #include main() int a,b,c,n,count=0; /*原来的代码: b=0 写在此行,应该把它移到循环内. */ for (a=150; a b=0; /*原来的代码: 移后的新位置 */ for (c=1;c if (a%c =0) b=b+c; if (b%a=0) count=count+1; printf("n count = %d",count); B 2、若某个整数N的所有因子之和等于N的倍数,则称N为多因子完备数。例如,28是多因子完备数。因为:1+2+4+7+14+28=56=28*2 ,下面程序求1,700间最大的多因子完备数,请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。 #include #include #include main() int a,b,c,n,big,count=0; for (a=1; a b=0; for (c=1;c /*原来的代码: c=2 */ if (a%c =0) b=b+c; if (b%a=0) big=a; /*原来的代码: big=b */ printf("%dn ",big); B 3、以下程序求10000以内的所有完全数的个数,请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。”完全数”是指:一个数如果刚好与它所有的真因子(不包括该数本身)之和相等,如:6=1+2+3,则6就是一个完全数。 #include #include #include main() int count,n,m,s,k; count=0; for (n=3;n s=0; /*原来的代码: s=1 */ k=n/2+1; for (m=1;m printf("nThe count=%d",count); if (n%m=0) s+=m; /*原来的代码: s+=1 */ if (s=n) count+=1; 类型C:数字问题 C 1、下面程序是求10,650之间同时满足除4余3或除5余4条件的数之和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。84544 #include #include #include main() long sum; /*原来的代码: int sum; */ int i; sum=0; for (i=10;i if (fmod(i,4)=3 | fmod(i,5)=4) sum+=i; clrscr(); printf("%ldn",sum); C 2、下面程序是求2,60之间的所有偶数的立方和。请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。1729800 #include #include #include main() long sum; long i; /*原来的代码: int i */ sum=0; for (i=2;i if (fmod(i,2)=0) sum+=i*i*i; /*原来的代码: sum+=i*3 */ clrscr(); C 3、下例程序中,函数fun的功能是:计算并输出k以内的最大的10个能被13和17整除的自然数之和。请改正程序中的错误,并运行正确的程序。当从键盘输入2500时,给出程序运行的正确结果 14365 #include #include int fun(int k) int m=0, mc=0, j; while(k>=2) && mc m=m+k; mc+; k-; return m; /*原来的代码:return ; */ printf("%ldn",sum); main() int k; clrscr(); printf("n 请输入整数:"); scanf("%d", &k); printf("n 结果是: %dn",fun(k); 类型D:数列 D 1、下面的程序中,函数fun的功能是:根据形参m,计算下面公式的值。 T=1/1!+1/2!+1/3!+.+1/m! 请改正程序中的错误,并运行改正后的程序。当从键盘输入10时,给出程序运行的正确结果(按四舍五入保留10位小数)。 #include #include double fun(int m) double fac, t=0.0; int i=1, j; for(i=1;i for(j=1; j /*原来的代码: for(j=1; j t+=1.0/fac; return t; main() int m; clrscr(); printf("n 请输入整数: "); scanf("%d", &m); printf("n 结果是: %12.10lf n",fun(m); D 2、下面的程序是计算:s=f(-30)+f(-29)+.+f(-1)+f(0)+f(1)+.+f(30)的值。其中函数定义如下: f(x)=(x+1)/(x-2) if x>1 f(x)=0 if x=0 or x=2 f(x)=(x-1)/(x-2) if x #include #include double f(double x) if(x=0 | x=2) /*原来的代码: && */ return 0.0 ; else if(x return (x-1)/(x-2); else return (x+1)/(x-2); double fsum(int n) int i; double s=0.0, y; for(i=-n; i y=f(1.0*i); s+=y; return s; /*原来的代码: return y; main() clrscr(); printf("%lfn", fsum(30); D 3、已知fibonacci数列:1,1,2,*/ 3,5,.,它可由下面公式表述: 8 F(1)=1 if n=1 F(2)= 1 if n=2 F(n)=F(n-1)+F(n-2) if n>2 以下程序是求F(30),请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。832040 #include #include main() double f1,f2; int i; f1=1;f2=1; for (i=1;i /*原来的代码: i f1=f1+f2; f2=f2+f1; clrscr(); printf("n the number is :%12.0lf",f2); /*原来的代码: f1 */ D 4、下面的程序是求表达式的值: s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+.+(1*2*3*.*n)/(3*5*7*.(2*n+1) 请修改程序中的错误,并运行修改后的程序。当n=30时,程序的运行结果(保留10位小数)。1.5707963267 #include #include #include double fun(int n) double s, t; int i; s=1.0; t=1.0; for(i=1;i t=t*i/(2*i+1); /*原来的代码: t=t*n/(2*n+1); */ s+=t; /*原来的代码: s=t */ return s; main() printf("n %12.10lf", fun(30); D 5、下面的程序是求如下表达式的值。S=sqrt(ln(1)+ln(2)+ln(3)+ln(n) 请改正程序中的错误,并运行修改后的程序, 当n=50时,给出程序运行结果(保留6位小数)。12.185145 #include #include #include double fun(int n) /*原来的代码: int fun(int n) */ double s=0; int i; /*原来的代码: int s=0; */ for(i=1;i s+=log(1.0*i); s=sqrt(s); return s; main() clrscr(); printf("%lfn",fun(50); D 6、下列程序的功能是求出以下分数序列的前35之和,2/1,3/2,5/3,8/5,13/8,21/13,.请改正程序中的错误,并运行修改后程序,给出程序结果(保留6位小数)。56.930771 #include #include main() long a,b,c,k; double s; clrscr(); s=0.0; a=2; b=1; for(k=1;k s=s+(double)a/b; /*原来的代码: (Double)a/b */ c=a; a=a+b; b=c; /*原来的三条交换语句写错了:a=a+b; c=a; b=c;*/ printf("n 结果: %lfn", s); D 7、下列程序的功能是求出以下分数序列的前25之和,2/1,3/2,5/3,8/5,13/8,21/13,.请改正程序中的错误,并运行修改后程序,给出程序结果(保留6位小数)。40.750431 #include #include double fun(int n) /*原来的代码: fun(n) */ long a,b,c; int k; double s; s=0.0; a=2; b=1; for(k=1; k s=s+(double)a/b; c=a; a=a+b; b=c; return s; main() int n=25; clrscr(); printf("n result: %lfn",fun(n); 类型E:同构数 E1下面程序求1,600之间最大的同构数,请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。同构数是:一自然数平方的末几位与该数相同时,称此数为自构数,例如:55=25,则称5为自同构数。376 #include #include #include main() long n,m,s,k,big; for (n=3;n if (n else if (n else k=1000; s=n*n; s=s-n; if (s%k=0) big=n; /*原来的代码: big=s */ printf("n The biggest = %ld",big); /*原来的代码: %d */ C改错题例题 C改错题定稿 改错题 改错题 改错题 改错题 改错题 改错题 改错题 改错题