c语言程序设计复习题参考答案612.docx
《c语言程序设计复习题参考答案612.docx》由会员分享,可在线阅读,更多相关《c语言程序设计复习题参考答案612.docx(34页珍藏版)》请在冰点文库上搜索。
![c语言程序设计复习题参考答案612.docx](https://file1.bingdoc.com/fileroot1/2023-6/6/e215b6da-7daf-4621-976a-29c407c8a369/e215b6da-7daf-4621-976a-29c407c8a3691.gif)
c语言程序设计复习题参考答案612
《C语言程序设计》复习题库参考答案
1、计算下面公式的值。
T=1/1!
+1/2!
+1/3!
+……+1/m!
当m=5时的结果(按四舍五入保留3位小数)。
(注:
所有变量用float数据类型定义!
)答案:
1.717
#include
main()
{
inti,m=5,p=1;
floatt=0;
for(i=1;i<=m;i++)
{
p*=i;
t+=1.0/p;
}
printf("%.3f\n",t);
}
2、程序填空:
用*号输出字母C的图案。
#include"stdio.h"
#include"conio.h"
main()
{
_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
main()
{
longi,s=0,a,b,c,d;
for(i=1000;i<10000;i++)
{
if(i%2!
=0)
{
a=i/1000;/*千位数*/
b=i/100%10;/*百位数*/
c=i/10%10;/*十位数*/
d=i%10;/*个位数*/
if((a+b+c+d)%15==0)
s=s+i;
}
}
printf("s=%ld\n",s);
}
4、/*下面程序的功能是:
计算并输出700以内的最大的10个能被13或者17整除的自然数之和。
请改正程序中的错误,并运行,最后给出程序运行的正确结果。
(注:
只有一处错误!
)*/答案:
6591
#include
voidmain()
{
inttotal=0,mc=0,k=700;/*mc用于表示数组的下标值,初始时表示第一个元素应为mc=0*/
intpm[10],count=0;
while((k>=2)&&mc<=10)
{
if((k%13==0)||(k%17==0))
{
pm[mc]=k;
mc++;
}
k--;
}
for(k=1;k<=10;k++)
total+=pm[k-1];
printf("%d\n",total);
}
5、求x=1+1/5+1/7+1/9+…的近似值,直到最后一项的绝对值小于10-5为止。
#include
#include
main()
{
doublex=1;
inti;
for(i=5;fabs(1.0/i)>=1e-5;i=i+2)
x+=1.0/i;
printf("x=%f\n",x);
}
6、计算如下公式的A20值。
A1=1,A2=1/(1+A1),A3=1/(1+A2),A4=1/(1+A3),......(按四舍五入保留10位小数)。
答案:
0.
#include
main()
{
inti;
doublea=1.0;
for(i=2;i<=20;i++)
a=1/(1+a);
printf("A20=%.10f\n",a);
}
7、求[10,1600]之间能被7整除的奇数之和。
答案:
90965
#include
main()
{
inti,s=0;
for(i=10;i<=1600;i++)
if(i%7==0&&i%2!
=0)
s+=i;
printf("s=%d\n",s);
}
8、函数mystrlen(char*s)的功能是求字符串s的长度。
请填空。
intmystrlen(char*s)
{intnum=0;
while(*s++!
='\0'){__num++__;}
return(num);
}
9、[100,500]之间同时满足除以7余5,除以5余3,除以3余1的整数之和。
答案:
1042
#include
main()
{
inti,s=0;
for(i=100;i<=500;i++)
if(i%7==5&&i%5==3&&i%3==1)
s+=i;
printf("s=%d\n",s);
}
10、求[100,999]之间所有的素数的个数。
答案:
143
#include
main()
{
inti,j,n=0;
for(i=100;i<=999;i++)
{
for(j=2;j
if(i%j==0)
break;
if(j==i)
n+=1;
}
printf("n=%d\n",n);
}
11、编写程序,求满足下列条件的所有四位数ABCD的个数,该四位数是8的倍数,且A+B=B+C,即第1位数加上第2位数等于第2位数加上第3位数。
答案:
110
#include
main()
{
inti,n=0,a,b,c;
for(i=1000;i<10000;i++)
{
a=i/1000;
b=i/100%10;
c=i/10%10;
if(i%8==0&&(a+b)==(b+c))
n+=1;
}
printf("n=%d\n",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
voidmain()
{
longsum=0,a[30]={1,2,1};
intk,j;
for(k=3;k<10;k++)
a[k]=a[k-1]+a[k-2]+a[k-3];
for(j=1;j<=10;j++)
sum+=a[j-1];/*数组a初始下标应为0,所以此处应改为a[j-1]*/
printf("%ld\n",sum);
}
13、/*求1到2000之间的双胞胎数的对数。
双胞胎数:
两素数差为2称为双胞胎数。
例如227和229是一对双胞胎数,它们都是素数且差为2。
*/答案:
61
#include
intprime(intx)
{
intk;
for(k=2;kif(__x%k==0____)break;
if(k==x)return1;
elsereturn0;
}
voidmain()
{inta,b,n=0;
intprime(intx);
for(a=2;a<=1998;a++)
{
if(prime(a)==1)
{b=a+2;
if(__prime(b)___)n++;
}
}
printf("%d\n",n);
}
14、编写程序,统计200~400之间的所有满足三个数字之积为42,三个数字之和为12的数的个数。
答案:
4
#include
main()
{
inti,a,b,c,n=0;
for(i=200;i<=400;i++)
{
a=i/100;
b=i/10%10;
c=i%10;
if(a+b+c==12&&a*b*c==42)
n+=1;
}
printf("n=%d\n",n);
}
15、有30个学生一起买小吃,共花钱50元,其中每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数为0的解)?
答案:
9
#include
main()
{
inti,j,k,n=0;
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
for(k=1;k<=28;k++)
if(i+j+k==30&&i+2*j+3*k==50)
n+=1;
printf("n=%d\n",n);
}
16、爱因斯坦走台阶:
有一台阶,如果每次走两阶,最后剩一阶;如果每次走三阶,最后剩两阶;如果每次走四阶,最后剩三阶;如果每次走五阶,最后剩四阶;如果每次走六阶,最后剩五阶;如果每次走七阶,刚好走完.求满足上述条件的最小台阶数是多少?
答案:
119
#include
main()
{
intm,n;
for(n=1;;n++)
if(n%2==1&&n%3==2&&n%4==3&&n%5==4&&n%6==5&&n%7==0)
break;
printf("n=%d\n",n);
}
17、/*求1000以内最大的10个素数的和。
*/答案:
9664
#include
intprime(longn)
{
longk;
for(k=2;k<=n-1;k++)
if(_n%k==0__)return0;
return1;
}
voidmain()
{
longt,total=0,num=0;
intprime(longn);
for(t=1000;t>=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
longjc(longx)
{
longk,fac=1;
for(k=1;__k<=x_;k++)
fac*=k;
__returnfac___;
}
voidmain()
{
longn,sum=0;
longjc(longx);
for(n=1;n<=7;n++)
__sum+=jc(n)__;
printf("\n%ld",sum);
}
19、求10000以内所有完数之和,"完数"是指:
一个数如果刚好与它所有的真因子(不包括该数本身)之和相等,如:
6=1+2+3,则6就是一个完数。
(注:
所有变量用int数据类型定义!
)答案:
8658
#include
main()
{
inti,j,k,s=0;
for(i=1;i<=10000;i++)
{
for(j=1,k=0;j
if(i%j==0)
k+=j;
if(k==i)
s+=i;
}
printf("s=%d\n",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项。
请改正程序中的错误,并运行修改后的程序,给出程序结果。
(注:
只有一处错误!
)*/答案:
#include
#include
#defineN30
voidmain()
{
longa[N];
intk;
clrscr();
a[0]=1;a[1]=2;a[2]=1;
for(k=3;k<=24;k++)/*应改为k<=24,因为第数组下标24即为数组的第25个元素。
a[k]=a[k-1]+a[k-2]+a[k-3];
printf("%ld\n",a[k-1]);/*因for循环结束后k值为25所以必须减1求得a[24]的值*/
}
21、/*求区间[200,3000]中所有回文数的和,回文数是正读与反读都是一样的数,如525,1551。
*/答案:
87970
#include
inthws(longn)
{
longx=n,t=0,k;
while(x>0)
{
k=x%10;
t=t*10+k;
x=x/10;
}
if(t==n)return1;/*t==n中间有两个等号*/
elsereturn0;
}
voidmain()
{
longk,s=0;
inthws(longn);
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.
#include
doublefun(intn)
{
doubles=1.0,t=1.0;
intk;
doublertn=1.0;
for(k=1;k<=n;k++)
{
t=t*k;
s=s*(2*k+1);
rtn+=t/s;
}
returnrtn;
}
voidmain()
{
doublesum;
sum=fun(25);
printf("\n%.10lf",sum);
}
23、已知:
Sn=2/1+3/2+4/3+…+(n+1)/n,求Sn不超过50的最大值(按四舍五入的方式精确到小数点后第三位)。
答案:
49.395
#include
main()
{
inti;
floatsn=0;
for(i=1;;i++)
{
sn+=(float)(i+1)/i;
if(sn>=50)
{
sn-=(float)(i+1)/i;
break;
}
}
printf("sn=%.3f\n",sn);
}
24、计算Y=X/1!
-X^3/3!
+X^5/5!
-X^7/7!
+……前20项的值(已知:
X=2)。
要求:
按四舍五入的方式精确到小数点后第二位。
答案:
0.91
#include
#include
#defineX2
main()
{
inti,j,n;
doubley=0,p;
for(i=1,n=1;i<=20;n+=2,i++)
{
for(j=1,p=1;j<=n;j++)
p*=j;
y+=pow(-1,i+1)*pow(X,n)/p;
}
printf("y=%.2f\n",y);/*printf("y=%.2f\n",(int)(y*100+0.5)/100.0);*/
}
25、若某正整数平方等于某两个正整数平方之和,称该正整数为弦数。
例:
3^2+4^2=5^2,则5为弦数,求[131,200]之间最小的弦数。
答案:
135
#include
#include
#include
main()
{
inti,j,k;
for(i=131;i<=200;i++)
{
for(j=1;j
{k=(int)(sqrt(i*i-j*j));
if(j*j+k*k==i*i)
{
printf("i=%d\n",i);
exit(0);
}
}
}
}
26、已知X,Y,Z为三个正整数,且X^2+Y^2+Z^2=25^2,求X+Y+Z的最大值。
答案:
43
#include
#include
main()
{
intx,y,z,max=0;
for(x=1;x<25;x++)
{
for(y=1;y<25;y++)
{
z=(int)(sqrt(25*25-x*x-y*y));
if((x*x+y*y+z*z==25*25)&&max<(x+y+z))
{
max=x+y+z;
}
}
}
printf("max=%d\n",max);
}
27、猴吃桃:
有一天小猴子摘下了若干个桃子,当即吃掉一半,还觉得不过瘾,又多吃了一个。
第二天接着吃了剩下的桃子中的一半,仍不过瘾,又多吃了一个。
以后每天都是吃尚存桃子的一半零一个。
到第10天早上小猴子再去吃桃子时,看到只剩下一个桃子了。
问小猴子第一天共摘下了多少个桃子。
答案:
1534
#include
main()
{
inti,n=1;
for(i=9;i>=1;i--)
{
n=(n+1)*2;
}
printf("%d\n",n);
}
28、求[1,50]之间的所有整数能构成直角三角形的三边的组数。
例如:
3*3+4*4=5*5,它们构成直角三角形,所以{3,4,5}作为一组,但{4,3,5}视为跟{3,4,5}相同的一组。
答案:
20
#include
main()
{
intx,y,z,n=0;
for(x=1;x<=48;x++)
for(y=x;y<=49;y++)
for(z=y;z<=50;z++)
if(x*x+y*y==z*z)
n++;
printf("%d\n",n);
}
29、15元钱换成1元、2元、5元的票面,问有多少种不同的兑换方法?
输出所有的兑换方法。
答案:
18种
#include
main()
{
inti,j,k,n=0;
for(i=0;i<=15;i++)
for(j=0;j<=7;j++)
for(k=0;k<=3;k++)
if(i+2*j+5*k==15)
{
n++;
printf("%d%d%d\n",i,j,k);
}
printf("n=%d\n",n);
}
30、用迭代法求x等于a开平方的正数值。
迭代公式为:
xn+1=1/(2*(xn+a/xn)),要求直到前后两次求出的x的差的绝对值小于10-5为止。
A的值从键盘输入。
#include
#include
main()
{
floata,xn=1,xn1,d;
scanf("%f",&a);
do{
xn1=1/(2*(xn+a/xn));
d=xn1-xn;
xn=xn1;
}while(fabs(d)>=1e-5);
printf("xn=%f\n",xn);
}
31、求最大的水仙花数,所谓水仙花数,指的是一个三位数,其各个数字的立方之和等于该数。
答案:
407
#include
main()
{
intx,a,b,c,max=0;
for(x=100;x<=999;x++)
{
a=x/100;
b=x/10%10;
c=x%10;
if(a*a*a+b*b*b+c*c*c==x)
max=x;
}
printf("%d\n",max);
}
32、一球从100米的高度自由落下,每次落地后反跳回原高度的一半,再落下。
求它在第10次落地时,共经过多少米?
第10次反弹多高?
答案:
299.0.
#include
main()
{
floats=100,h=50;
inti;
for(i=2;i<=10;i++)
{
s+=2*h;
h/=2;
}
printf("s=%fh=%f\n",s,h);
}
33、编写程序,完成如下功能,输入8个float类型的实数,分别求最大值和最小值,保留三位小数输出最大值和最小值。
#include
main()
{
floata[8],max,min;
inti;
for(i=0;i<8;i++)
scanf("%f",&a[i]);
max=min=a[0];
for(i=1;i<8;i++)
{
if(maxmax=a[i];
if(min>a[i])
min=a[i];
}
printf("max=%fmin=%f\n",max,min);
}
34、编写程序输出如下字符图形:
@@@@@@@@@@@
@@@@@@@@@@
…
@@
@
#include
main()
{
inti,j;
for(i=11;i>=1;i--)
{
for(j=1;j<=i;j++)
printf("@");
printf("\n");
}
}
35、计算:
s=f(-30)+f(-29)+......+f(-1)+f(0)+f
(1)+......+f(30)的值。
其中函数定义如下:
f(x)=(x+1)/(x-2)如果x>1;f(x)=0如果x=0或x=2;f(x)=(x-1)/(x-2)如果x<0。
(按四舍五入保留6位小数)答案:
65.
题目给定条件不完整,无法得出正确结果。
#include
main()
{
intx;
floatfx,s=0;
for(x=-30;x<=30;x++)
{
if(x==0||x==2)
fx=(float)(x-1)/(x-2);
if(x>1)
fx=0;
if(x<0||x==1)
fx=(float)(x+1)/(x-2);
s+=fx;
}
printf("%.6f\n",s);
}
36、编写程序输出如下字符图形(最后一行19颗星):
**