1、C语言程序设计复习题库答案 C语言程序设计复习题库1、计算下面公式的值。T=1/1!+1/2!+1/3!+1/m! 当m=5时的结果(按四舍五入保留3位小数)。(注:所有变量用float数据类型定义!)答案:1.717main() float T=0,m,n=1; for(m=1;m=5;m+) n=n*m; T=T+1.0/n; printf(%.3fn,T);2、程序填空:用*号输出字母C的图案。#include stdio.h#include conio.hmain()_printf( *n);_getch(); #include#includemain() printf( *n); p
2、rintf(*n); printf(*n); printf( *n);3、8232和9678,它们的个、十、百、千各位数字之和是15的倍数,8+2+3+2=15,9+6+7+8=30。编写程序,求四位数的所有奇数中,这样的数(各位数字之和是15的倍数)的总和。(注:所有变量用long数据类型定义!) 答案:1533459long Zi_hanshu(long shu) long ge,shi,bai,qian; ge=shu%10; shi=shu%100/10; bai=shu%1000/100; qian=shu/1000; if(ge+shi+bai+qian)%15=0) return
3、 1; else return 0;main() long i,s=0; for(i=1001;i=9999;i+=2) if(Zi_hanshu(i)=1) s+=i; printf(这样的数的总和是%dn,s);4、 /*下面程序的功能是:计算并输出700以内的最大的10个能被13或者17整除的自然数之和。请改正程序中的错误,并运行,最后给出程序运行的正确结果。(注:只有一处错误!)*/ 答案:6591#include void main() int total=0, mc=1, k=700; int pm10,count=0; while( (k=2) & mc=10 ) if (k%1
4、3=0) | (k%17=0) pmmc = k; mc+; k-; for( k=1;k=10;k+ ) total += pmk-1; printf( %dn,total); 主函数中变量赋初值时mc=1改为mc=05、求x = 1+1/5+1/7+1/9+的近似值,直到最后一项的绝对值小于10-5为止。#includemain() int i=5; float n=1,x=0; while(fabs(n)=1e-5) x+=n; n=1.0/i; i+=2; printf(1+1/5+1/7+1/9+=%fn,x);6、计算如下公式的A20值。 A1=1, A2=1/(1+A1), A3
5、=1/(1+A2), A4=1/(1+A3), .(按四舍五入保留10位小数)。答案:0.6180339850main() double A1=1,A2; int i; for(i=1;i20;i+) A2=1.0/(A1+1); A1=A2; printf(A20=%.10fn,A1);7、求10,1600之间能被7整除的奇数之和。答案:90965main() int jishu,s=0; for(jishu=11;jishu=1600;jishu+=2) if(jishu%7=0) s+=jishu; printf(%dn,s);8、函数mystrlen(char *s)的功能是求字符串s
6、的长度。请填空。Int mystrlen(char *s)int num=0;while( ) _;return ( );9、100,500之间同时满足除以7余5,除以5余3,除以3余1的整数之和。答案:1042main() int shu,s=0; for(shu=100;shu=500;shu+) if(shu%7=5&shu%5=3&shu%3=1) s+=shu; printf(%dn,s);10、求100,999之间所有的素数的个数。答案:143int su_shu(int shu) int i; for(i=2;ishu;i+) if(shu%i=0) return 0; else
7、 return 1; main() int shu,n=0; for(shu=100;shu=999;shu+) if(su_shu(shu)=1) n+; printf(素数的个数为%d个n,n);11、编写程序,求满足下列条件的所有四位数ABCD的个数,该四位数是8的倍数,且A+B=B+C,即第1位数加上第2位数等于第2位数加上第3位数。答案:110main() int shu,n=0; for(shu=1000;shu=9999;shu+) if(shu%8=0) if(shu/1000+shu%1000/100=shu%1000/100+shu%100/10) n+; printf(%
8、dn,n);12、 /*数列1,2,1,4,7,12,23具有这样的特征,从第四项(也就是4)开始,每一项是前三项之和,4=1+2+1,7=2+1+4,12=1+4+7.。下列程序的功能是求出该数列前10项的和。请改正程序中的错误,并运行修改后的程序,给出程序结果。(注:只有一处错误!)*/ 答案:311#include void main() long sum=0,a30=1,2,1; int k,j; for( k=3;k10;k+ ) ak = ak-1+ak-2+ak-3; for( j=1;j=10;j+ ) sum += aj; printf( %ldn,sum); for(j=1
9、;j=10;j+)改为for(j=0;j10;j+)或者for(j=0;j=9;j+)因为前面赋值时数组下标是从0开始的13、 /*求1到2000之间的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。例如227和229是一对双胞胎数,它们都是素数且差为2。*/ 答案:61#include int prime(int x) int k; for(k=2;kx;k+) if(_) break; if(k=x) return 1; else return 0;void main( ) int a,b,n=0; int prime(int x); for(a=2;a=1998;a+) if(pri
10、me(a)=1) b=a+2; if(_) n+; printf( %d n,n);第一空:if(x%k=0)break;第二空:if(prime(b)=1)n+;14、编写程序,统计200400之间的所有满足三个数字之积为42,三个数字之和为12的数的个数。答案:4int PanDuan(int shu) int ge,shi,bai; ge=shu%10; shi=shu%100/10; bai=shu/100; if(ge*shi*bai=42)&(ge+shi+bai=12) return 1; else return 0;main() int shu,n=0; for(shu=200
11、;shu=400;shu+) if(PanDuan(shu)=1) n+; printf(%dn,n);15、有30个学生一起买小吃,共花钱50元,其中每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数为0的解)?答案:9main() int da,zhong,n=0; for(da=1;da=30-1-1;da+) for(zhong=1;zhong30-1-da;zhong+) if(3*da+2*zhong+1*(30-da-zhong)=50) n+; printf(%dn,n);16、爱因斯坦走台阶:有一台阶,如果每次走
12、两阶,最后剩一阶;如果每次走三阶,最后剩两阶;如果每次走四阶,最后剩三阶;如果每次走五阶,最后剩四阶;如果每次走六阶,最后剩五阶;如果每次走七阶,刚好走完.求满足上述条件的最小台阶数是多少?答案:119 ain() int shu=6; while(1)/死循不断环判断 shu+; if(shu%7=0&shu%6=5&shu%5=4&shu%4=3&shu%3=2&shu%2=1) break;/也可以使用标志位判断 printf(%dn,shu);17、 /*求1000以内最大的10个素数的和。*/ 答案:9664#include int prime(long n) long k; for
13、(k=2;k=2;t-) if(_) total=total+t; num+; if(num=10)break; 第一空:if(x%k=0)break;第二空:if(prime(t)=1)n+; printf(n%ld,total);18、 /*求1!+2!+3!+.+7!,7!表示7的阶乘。*/ 答案:5913#include long jc( long x) long k,fac=1; for(k=1;_;k+) fac *=k ; _;void main( ) long n,sum=0; long jc(long x); for(n=1;n=7;n+) _; printf(n%ld,su
14、m);第一空:for(k=1;k=x;k+)/循环x次;累乘即为x的阶乘第二空:return fac;/返回阶乘值第三空:sum=sum+jc(n);/阶乘值累加19、求10000以内所有完数之和,完数是指:一个数如果刚好与它所有的真因子(不包括该数本身)之和相等,如:6=1+2+3,则6就是一个完数。(注:所有变量用int数据类型定义!) 答案:8658 int PanDuan(int shu) int he=0,i=1; for(i=1;ishu;i+) if(shu%i=0) he+=i; if(he=shu) return 1; else return 0;main() int i,s
15、=0; for(i=0;i=10000;i+) if(PanDuan(i)=1) s+=i; printf(%dn,s);20、/*数列1,2,1,4,7,12,23具有这样的特征,从第四项(也就是4)开始,每一项是前三项之和,4=1+2+1,7=2+1+4,12=1+4+7.。下列程序先给出数列的第一项(1)、第二项(2)、第三项(1),再逐步计算其它项并保存在数组a中,最后求出该数列的第25项。请改正程序中的错误,并运行修改后的程序,给出程序结果。(注:只有一处错误!)*/答案:1323525#include #include #define N 30void main() long aN
16、; int k; clrscr(); a0 = 1; a1 = 2; a2=1; for( k=3;k=20;k+ ) ak = ak-1+ak-2+ak-3; printf( %ldn,ak-1); for(k=3;k=20;k+)改为for(k=3;k=24;k+)因为第25项为a24循环出来后k=25,故输出时应输出ak-121、/*求区间200,3000中所有回文数的和,回文数是正读与反读都是一样的数,如525,1551。*/ 答案:87970#include int hws(long n) long x=n,t=0,k; while(x0) k=x%10; t = t*10 + k;
17、 x=x/10; if( _) return 1; else return 0;void main( ) long k,s=0; int hws(long n); for(k=200; k=2000;k+) if(_) s=s+k; printf(n%ld,s);第一空:if(t=n)return 1;/t为n的倒序数,判断t和n是否相等来判断是否为回文数第二空:if(hws(k)=1);或者直接if(hws(k);因为if()里面非0为真,返回1时为真。此句判断是回文数则累加22、/*下面的程序是求表达式的值:s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+.+(1*
18、2*3*.*n)/(3*5*7*.(2*n+1)请将程序补充完整,并给出当n=25时,程序的运行结果(按四舍五入保留10位小数)。*/答案:1.5707963267#include double fun(int n) double s=1.0, t=1.0; int k; double rtn=1.0; for(k=1;k=n; k+) t = t*k; s = s*(2*k+1); _ return rtn;void main() double sum; _ printf(n %.10lf,sum);第一空:rtn=rtn+t/s;第二空:sum=fun(25);23、已知:Sn=2/1+3
19、/2+4/3+(n+1)/n, 求Sn不超过50的最大值(按四舍五入的方式精确到小数点后第三位)。答案:49.395 main() float Sn=0,n=0; while(Sn=50) n+; Sn=Sn+(n+1)/n; Sn=Sn-(n+1)/n;/跳出循环时Sn大于50, /减去最后一次所加值即得符合要求的最大数 printf(%.3fn,Sn);24、计算Y=X/1!-X3/3!+X5/5!-X7/7!+前20项的值(已知:X=2)。要求:按四舍五入的方式精确到小数点后第二位。答案: 0.91 /*开始总是调试不出,后来才意识到是程序中涉及到的数据很大,均设为双精度型变量*/#in
20、cludedouble Mi(double m,int n)/求m的n次方函数 int i; double x=1.0; for(i=1;i=n;i+) x*=m; return x;double Jiecheng(int n)/求n的阶乘函数 int i; double x=1.0; for(i=1;i=n;i+) x*=i; return x;main() int i; double y=0,n; for(i=1;i=20;i+)/前20项 n=Mi(-1,i+1)*Mi(2,2*i-1)/Jiecheng(2*i-1);/各项大小 /Mi(-1,i+1)控制符号,Mi(2,2*i-1)为
21、幂分子,Jiecheng(2*i-1)为阶乘分母 y+=n;/各项和 printf(%.2fn,y);/四舍五入保留两位小数输出25、若某正整数平方等于某两个正整数平方之和,称该正整数为弦数。例:32+42=52,则5为弦数,求131,200之间最小的弦数。答案:135 #include/方法1main() int x,y,z; for(z=131;z=200;z+)/在131,200内查找 for(x=1;x=200;x+)/循环给x赋值 for(y=1;y=200;y+)/循环给y赋值 if(z*z=x*x+y*y)goto End;/只求满足条件的最小数,故一旦满足条件,则退出所有循环
22、End:/退出循环 printf(%dn,z);/输出满足条件的最小数 /方法2/*main() int x,y,z,shu; for(z=131;z=200;z+)/在131,200内查找 for(x=1;x=200;x+)/循环给x赋值 for(y=1;y=200;y+)/循环给y赋值 if(z*z=x*x+y*y) shu=z;/保存满足条件的最小的数 x=201; y=201; z=201;/通过赋值试循环结束 /只求满足条件的最小数,故一旦满足条件,则退出所有循环 printf(%dn,shu);/输出满足条件的最小数 */26、已知X,Y,Z为三个正整数,且X2+Y2+Z2=252
23、,求X+Y+Z的最大值。答案:43 #includemain() int x,y,z,max=0; for(x=1;x=25;x+) for(y=1;y=25;y+) for(z=1;zmax)max=x+y+z; /取满足条件的所有各数和的最大值 printf(%dn,max);/输出满足条件的所有各数和的最大值27、猴吃桃:有一天小猴子摘下了若干个桃子,当即吃掉一半,还觉得不过瘾,又多吃了一个。第二天接着吃了剩下的桃子中的一半,仍不过瘾,又多吃了一个。以后每天都是吃尚存桃子的一半零一个。到第10天早上小猴子再去吃桃子时,看到只剩下一个桃子了。问小猴子第一天共摘下了多少个桃子。答案:1534
24、 /*纯粹是个数学题,计算思路出来了,程度也就出来了*/#includemain() int i,n=1;/n为剩余桃子个数,第十天为1个 for(i=1;i=9;i+)/小猴子吃了9天的桃子 n=2*(n+1);/前一天剩余的桃子数是今天剩余桃子数加1的两倍 printf(%dn,n);/输出第一天剩余的桃子数,即第一天小猴子摘下的桃子数28、求1,50之间的所有整数能构成直角三角形的三边的组数。例如:3*3+4*4=5*5,它们构成直角三角形,所以3,4,5作为一组,但4,3,5视为跟3,4,5相同的一组。答案:20 #includemain() int a,b,c;/定义三角形的三条边长
25、度为整型变量 int n=0;/定义组数,赋初值0初始化 for(a=1;a=50;a+)/选择第一边 for(b=1;b=50;b+)/选择第二边 for(c=1;c=50;c+)/选择第三边 /此处不考虑所选择的三条边是否能构成三角形,因为不能构成三角形时 /必不满足直角三角形的条件,对程序结果无影响 if(a*a+b*b=c*c)n+;/判断是否满足构成直角三角形的条件,满足则n加1 n=n/2;/a*a+b*b=c*c等式中,最长边c确定后补可改变,而a、b可互换值使等式成立, /此时组别均重复累加了一次,故最终需除以2(类比数学中排列组合例子) printf(%dn,n);/输出满足条件的组数29、15元钱换成1元、2元、5元的票面,问有多少种不同的兑换方法?输出所有的兑换方法。 答案: 18种#includemain() int i=1,j=1,k=1,n=0; printf(兑换方法有:n); printf(1元/张 2元/张 5元/张n); for(i=0;i=3;i+)/5元的最多3账 for(j=0;j=7;j+)/2元的最多7张 for(k=0;k=15;k+)/1元的最多15张 if(5*i+2*j+1*k=15) printf(%4d %4d %4dn,k,j,i); n+;/如果满足
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1