《《C语言程序设计》复习题库_答案.doc》由会员分享,可在线阅读,更多相关《《C语言程序设计》复习题库_答案.doc(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1、计算下面公式的值。T=1/1!+1/2!+1/3!+1/m! 当m=5时的结果(按四舍五入保留3位小数)。(注:所有变量用float数据类型定义!)答案:1.717#include float jc(float x)float jc=1,i;for(i=1;i=x;i+)jc=jc*i;return jc;void main()float jc(float x);float m,t=0,i; printf(Please Input:n);scanf(%f,&m); for(i=1;i=m;i+)t=t+1/jc(i);printf(t=%.3fn,t);2、程序填空:用*号输出字母C的图案
2、。#include stdio.h#include conio.hmain()_printf( *n);_printf( *n);printf( *n); printf( *n);getch(); 3、8232和9678,它们的个、十、百、千各位数字之和是15的倍数,8+2+3+2=15,9+6+7+8=30。编写程序,求四位数的所有奇数中,这样的数(各位数字之和是15的倍数)的总和。(注:所有变量用long数据类型定义!) 答案:#include long f(long x)long s=0;if(x%2!=0)while(x0)s=s+x%10;x=x/10;if(s%15=0) retu
3、rn 1;else return 0;else return 0;void main()long f(long x);long i,sum=0;for(i=1000;i=9999;i+)if(f(i) sum=sum+i;printf(sum=%ldn,sum);4、下面程序的功能是:计算并输出700以内的最大的10个能被13或者17整除的自然数之和。请改正程序中的错误,并运行,最后给出程序运行的正确结果。(注:只有一处错误!) 答案:6591#include void main() int total=0, mc=1, k=700; /改为:int total=0,mc=0,k=700; i
4、nt pm10,count=0; while( (k=2) & mc=10 ) if (k%13=0) | (k%17=0) pmmc = k; mc+; k-; for( k=1;k=10;k+ ) total += pmk-1; printf( %dn,total); 5、求x = 1+1/5+1/7+1/9+的近似值,直到最后一项的绝对值小于10-5为止。#include #includemain( )int i;double x;x=1;i=5;dox=x+1/(double)i;i=i+2;while(fabs(1/(double)i)1e-5);printf(%.2lfn,x);输
5、出:6.0586、计算如下公式的A20值。 A1=1, A2=1/(1+A1), A3=1/(1+A2), A4=1/(1+A3), .(按四舍五入保留10位小数)。答案:0.(1)可用递归: 1 n=1F(n)= 1/(1+f(n-1) n1#include double f(double n)double a;if(n=1) a=1;else a=1.0/(1+f(n-1);return a;void main()double f(double n);printf(f(20)=%.10lfn,f(20);(2)不用递归:#include void main()double i,c,a=1,
6、b=1,x;for(i=1;i20;i+)c=a;a=b;b=c+b;x=a/b; printf(x=%.10lfn,x);7、求10,1600之间能被7整除的奇数之和。答案:90965(1)用函数可写成:#include int jx(int x)if(x%2!=0) return 1;else return 0;int f(int x)if(jx(x)if(x%7=0) return 1;else return 0;else return 0;void main()int jx(int x);int f(int x);int i,s=0;for(i=10;i=1600;i+)if(f(i)
7、 s=s+i;printf(s=%dn,s);(2)不用函数可写成:#include void main()int jx(int x);int f(int x);int i,s=0;for(i=10;i=1600;i+)if(i%2!=0 & i%7=0) s=s+i;printf(s=%dn,s);8、函数mystrlen(char *s)的功能是求字符串s的长度。请填空。int mystrlen(char *s)int num=0;while(*s+!=0 ) _ num+_;return (num);9、100,500之间同时满足除以7余5,除以5余3,除以3余1的整数之和。答案:104
8、2#include void main() int i,sum=0; for(i=100;i=500;i+) if(i%7=5 & i%5=3 & i%3=1) sum=sum+i; printf(sum=%dn,sum);10、求100,999之间所有的素数的个数。答案:143#include int sushu(int x)int i;for(i=2;ix;i+)if(x%i=0) break;if(i=x) return 1;else return 0;void main()int sushu(int x);int i,num=0;for(i=100;i=999;i+)if(sushu(
9、i)num+;printf(num=%dn,num);11、编写程序,求满足下列条件的所有四位数ABCD的个数,该四位数是8的倍数,且A+B=B+C,即第1位数加上第2位数等于第2位数加上第3位数。答案:110#include int f(int x)int a,b,c,d;a=x/1000;b=x/100%10;c=x/10%10;d=x%10;if(a+b=b+c) return 1;return 0;void main()int i,num=0;for(i=1000;i=9999;i+)if(i%8=0) if(f(i) num+;printf(num=%dn,num);12、数列1,2
10、,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; /改为:sum+=aj-1; printf( %ldn,sum); 13、 /*求1到20
11、00之间的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。例如227和229是一对双胞胎数,它们都是素数且差为2。*/ 答案:61#include int prime(int x) int k; for(k=2;kx;k+) if(_x%k=0_) 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(prime(a)=1) b=a+2; if(_prime(b)=1_) n+; printf( %d n,n);14、编写程序,统计20
12、0400之间的所有满足三个数字之积为42,三个数字之和为12的数的个数。答案:4#include void main()int i,num=0;int a,b,c;for(i=200;i=400;i+)a=i/100;b=i/10%10;c=i%10;if(a*b*c=42 & a+b+c=12)num+;printf(num=%dn,num);15、有30个学生一起买小吃,共花钱50元,其中每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数为0的解)?答案:9#include void main()int num=0;int i
13、,j,k; /i为大学生人数,j为中学生人数,k为小学生人数for(i=1;i=30;i+)for(j=1;j=30-i;j+)for(k=1;k=30-i-j;k+)if(i*3+j*2+k*1=50 & i+j+k=30)printf(%d,%d,%dn,i,j,k);num+;printf(num=%dn,num);16、爱因斯坦走台阶:有一台阶,如果每次走两阶,最后剩一阶;如果每次走三阶,最后剩两阶;如果每次走四阶,最后剩三阶;如果每次走五阶,最后剩四阶;如果每次走六阶,最后剩五阶;如果每次走七阶,刚好走完.求满足上述条件的最小台阶数是多少?答案:119#includevoid mai
14、n() int x;for(x=1;x+) if (x%2=1)&(x%3=2)&(x%5=4)&(x%6=5)&(x%7=0) printf(%dn,x);break;17、求1000以内最大的10个素数的和。 答案:9664#include int prime(long n) long k; for(k=2;k=2;t-) if(_prime(t)_) total=total+t; num+; if(num=10)break; printf(n%ld,total);18、 /*求1!+2!+3!+.+7!,7!表示7的阶乘。*/ 答案:5913#include long jc( long
15、x) long k,fac=1; for(k=1;_ k=x_;k+) fac *=k ; _return fac_;void main( ) long n,sum=0; long jc(long x); for(n=1;n=7;n+) _sum=sum+jc(n)_; printf(n%ld,sum);19、求10000以内所有完数之和,完数是指:一个数如果刚好与它所有的真因子(不包括该数本身)之和相等,如:6=1+2+3,则6就是一个完数。(注:所有变量用int数据类型定义!) 答案:8658#include int ws(int x)int i,s=0;for(i=1;ix;i+)if(
16、x%i=0)s=s+i;if(s=x) return 1;else return 0;void main()int ws(int x);int i,sum=0;for(i=1;i=10000;i+)if(ws(i)sum=sum+i;printf(sum=%dn,sum);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项。请改正程序中的错误,并运行修改后的程序,给出程
17、序结果。(注:只有一处错误!)*/答案:#include #include #define N 30void main() long aN; int k; clrscr(); a0 = 1; a1 = 2; a2=1; for( k=3;k=20;k+ ) /改为:for( k=3;k=24;k+ ) ak = ak-1+ak-2+ak-3; printf( %ldn,ak-1); 21、/*求区间200,3000中所有回文数的和,回文数是正读与反读都是一样的数,如525,1551。*/ 答案:87970#include int hws(long n) long x=n,t=0,k; whil
18、e(x0) k=x%10; t = t*10 + k; x=x/10; if( _t=n_) return 1; else return 0;void main( ) long k,s=0; int hws(long n); for(k=200; k=3000;k+) if(_hws(k)_) s=s+k; printf(n%ld,s);22、/*下面的程序是求表达式的值: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=25时,程序的运行结果(按四舍五入保留10位小数)。*/答案:1
19、.#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); rtn=rtn+t/s;_ return rtn;void main() double sum; _sum=fun(25);_ printf(n %.10lf,sum);23、已知:Sn=2/1+3/2+4/3+(n+1)/n, 求Sn不超过50的最大值(按四舍五入的方式精确到小数点后第三位)。答案:49.395#include double fun() double t
20、=0,s=0; double n; for(n=1;n+) t=t+(n+1)/n; if(t50) break; s=t; return s;void main() printf(%.3lfn,fun();24、计算Y=X/1!-X3/3!+X5/5!-X7/7!+前20项的值(已知:X=2)。要求:按四舍五入的方式精确到小数点后第二位。答案: 0.91#include main( ) int i;double a,b,x,y;x=2;y=x;a=x;b=1;for(i=1;i=20;i+)a=-a*x*x;b=b*2*i*(2*i+1);y=y+a/b;printf(%.2lfn,y);2
21、5、若某正整数平方等于某两个正整数平方之和,称该正整数为弦数。例:32+42=52,则5为弦数,求131,200之间最小的弦数。答案:135#include int xs(int x)int i,j; for(i=1;ix;i+)for(j=1;jx;j+)if(i*i+j*j=x*x)return 1;return 0;void main( ) int i,j,x,flag=0;x=131; for(x=131;x=200;x+)if(xs(x)printf(%dn,x);break;26、已知X,Y,Z为三个正整数,且X2+Y2+Z2=252,求X+Y+Z的最大值。答案:43#includ
22、e void main()int x,y,z,max,sum;max=0;for(x=1;x=25;x+)for(y=1;y=25;y+)for(z=1;zmax) max=sum;printf(max=%dn,max);27、猴吃桃:有一天小猴子摘下了若干个桃子,当即吃掉一半,还觉得不过瘾,又多吃了一个。第二天接着吃了剩下的桃子中的一半,仍不过瘾,又多吃了一个。以后每天都是吃尚存桃子的一半零一个。到第10天早上小猴子再去吃桃子时,看到只剩下一个桃子了。问小猴子第一天共摘下了多少个桃子。答案:1534#include void main()float x,i,t;for(x=1;x+)t=x;
23、for(i=1;i10;i+)t=t-(t/2+1); if(t=1) break;printf(%fn,x);28、求1,50之间的所有整数能构成直角三角形的三边的组数。例如:3*3+4*4=5*5,它们构成直角三角形,所以3,4,5作为一组,但4,3,5视为跟3,4,5相同的一组。答案:20#include void main()int i,j,k,num=0;for(i=1;i=50;i+)for(j=i;j=50;j+)for(k=j;k=50;k+)if(i*i+j*j=k*k)num+;printf(%dn,num);29、15元钱换成1元、2元、5元的票面,问有多少种不同的兑换方
24、法?输出所有的兑换方法。 答案: 18种#include void main()int i,j,k,num=0,t=0;for(i=0;i=15;i+)for(j=0;j=15;j+)for(k=0;k=15;k+)if(i*1+j*2+k*5=15)num+; t+;printf(%dn,num);30、用迭代法求x等于a开平方的正数值。迭代公式为:xn+1=1/2*(xn+a/xn),要求直到前后两次求出的x的差的绝对值小于10-5为止。A的值从键盘输入。#include #includemain( ) float x0,x,a; scanf(%f,&a); x=1; do x0=x; x
25、=1.0/2*(x0+a/x0); while(fabs(x-x0)=1e-5); printf(%fn,x);31、求最大的水仙花数,所谓水仙花数,指的是一个三位数,其各个数字的立方之和等于该数。 答案:407#includeint flower(int n)int x=0,i,j,k;i=(n%10); j= (n/10%10);k=(n/100);x=i*i*i+j*j*j+k*k*k;if(x=n) return 1;else return 0;void main()int i,max=0;for(i=100;imax)max=i;printf(max=%dn,max);32、一球从1
26、00米的高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高? 答案: 299. 0.分析:设x=100,距离之和s的初值s=100落地次数(i)123经过距离(s)1005025。s=s+x反弹距离(x)502525/2。x=x/2#includevoid main()float x,s=0;int i;x=100; s=100; for(i=1;i=10;i+)if(i10)s=s+x;x=x/2;printf(sum=%f,x=%fn,s,x);33、编写程序,完成如下功能,输入8个float类型的实数,分别求最大值和最小值,保留三位小
27、数输出最大值和最小值。#includemain( )int i;float x,max,min;printf(Please input:);scanf(%f,&x);max=min=x;for(i=1;imax) max=x;elseif (xmin) min=x;printf(max=%.3f,min=%.3fn,max,min);34、编写程序输出如下字符图形: #includemain( )int i,j;for(i=11;i=1;i-)for(j=1;j=1; f(x)=0 如果 x=0 或 x=2 ;f(x)=(x-1)/(x-2) 如果 x0。(按四舍五入保留6位小数) 答案:65
28、.#includefloat f(float x)float result;if (x=0 | x=2)result=0;else if (x=1)result=(x+1)/(x-2);else if (x0)result=(x-1)/(x-2);return result;void main()float i,s=0;for(i=-30;i=30;i+)s=s+f(i);printf(s=%.6fn,s);36、编写程序输出如下字符图形(最后一行19颗星):* * * * * * * * * * * * * * * * * * *#includevoid main()int i,j,k;fo
29、r(i=1;i=9;i+)for(j=1;j=10-i;j+)printf( );for(k=1;k=2*i+1;k+)printf(*);printf(n);37、企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
30、#include main()double i;double bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf(%lf,&i); bonus1=10*0.1;bonus2=bonus1+*0.075; bonus4=bonus2+*0.05; bonus6=bonus4+*0.03; bonus10=bonus6+*0.015; if(i=)bonus=i*0.1; else if(i=)bonus=bonus1+(i-)*0.075;else if(i=)bonus=bonus2+(i-)*0.05;else if(i=)bonus=bonus4
31、+(i-)*0.03;else if(i=)bonus=bonus6+(i-)*0.015;elsebonus=bonus10+(i-)*0.01;printf(bonus=%lfn,bonus);38、计算下面公式的值。 T=1+1/(2*3)+1/(3*4)+1/(m*(m+1),当m=50时的结果(按四舍五入保留6位小数)。(注:所有变量用double数据类型定义!) 答案:1.#include main()double m,t=1;for(m=2;m=a&c=A&c=0&c=9) _digit+;_ else _others+;_ printf(all in all:char=%d s
32、pace=%d digit=%d others=%dn,letters, space,digit,others); getch();40、打印出如下图案(菱形) * * * *#include void main()int i,j,k,t;for(i=0;i=3;i+)for(j=0;j=10-i;j+)printf( );for(k=0;k=2*i;k+)printf(*);printf(n);t=j;for(i=0;i=2;i+)for(j=0;j=t+i;j+)printf( );for(k=0;k=4-2*i;k+)printf(*);printf(n);41、求出2,478以内的:
33、(1)最大的素数。 *467 (2)素数数目。 *91 (3)所有素数之和。 *19580#include #include int prime(int x) int k; for(k=2;kx;k+) if(x%k=0) break; if(k=x) return 1; else return 0;void main()int prime(int x);int i,max=0,sum=0,num=0;for(i=2;imax) max=i;printf(max=%d,num=%d,sum=%dn,max,num,sum);42、已知: (1)若N=10,求Y 。 * (2)若N=15,求Y。 *1.E+07#include double a( int x)double result;if(x%2!=0)result=x;elseresult=x/2.0;return result;double b(int x)double result;if(x%2!=0)result=x*x;elseresult=x*x*x;return result;double sum(int n)int i;
限制150内