《C语言程序设计》复习题库答案.docx
《《C语言程序设计》复习题库答案.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》复习题库答案.docx(31页珍藏版)》请在冰豆网上搜索。
《C语言程序设计》复习题库答案
《C语言程序设计》复习题库
1、计算下面公式的值。
T=1/1!
+1/2!
+1/3!
+……+1/m!
当m=5时的结果(按四舍五入保留3位小数)。
(注:
所有变量用float数据类型定义!
)答案:
1.717
main()
{
floatT=0,m,n=1;
for(m=1;m<=5;m++)
{
n=n*m;
T=T+1.0/n;
}
printf("%.3f\n",T);
}
2、程序填空:
用*号输出字母C的图案。
#include"stdio.h"
#include"conio.h"
main()
{
_____________
printf("*\n");
_____________
_____________
getch();
}
#include
#include
main()
{
printf("***\n");
printf("*\n");
printf("*\n");
printf("***\n");
}
3、8232和9678,它们的个、十、百、千各位数字之和是15的倍数,8+2+3+2=15,9+6+7+8=30。
编写程序,求四位数的所有奇数中,这样的数(各位数字之和是15的倍数)的总和。
(注:
所有变量用long数据类型定义!
)答案:
1533459
longZi_hanshu(longshu)
{
longge,shi,bai,qian;
ge=shu%10;
shi=shu%100/10;
bai=shu%1000/100;
qian=shu/1000;
if((ge+shi+bai+qian)%15==0)
return1;
else
return0;
}
main()
{
longi,s=0;
for(i=1001;i<=9999;i+=2)
{
if(Zi_hanshu(i)==1)
s+=i;
}
printf("这样的数的总和是%d\n",s);
}
4、/*下面程序的功能是:
计算并输出700以内的最大的10个能被13或者17整除的自然数之和。
请改正程序中的错误,并运行,最后给出程序运行的正确结果。
(注:
只有一处错误!
)*/答案:
6591
#include
voidmain()
{
inttotal=0,mc=1,k=700;
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);
}
主函数中变量赋初值时mc=1改为mc=0
5、求x=1+1/5+1/7+1/9+…的近似值,直到最后一项的绝对值小于10-5为止。
#include
main()
{
inti=5;
floatn=1,x=0;
while(fabs(n)>=1e-5)
{
x+=n;
n=1.0/i;
i+=2;
}
printf("1+1/5+1/7+1/9+…=%f\n",x);
}
6、计算如下公式的A20值。
A1=1,A2=1/(1+A1),A3=1/(1+A2),A4=1/(1+A3),......(按四舍五入保留10位小数)。
答案:
0.6180339850
main()
{
doubleA1=1,A2;
inti;
for(i=1;i<20;i++)
{
A2=1.0/(A1+1);
A1=A2;
}
printf("A20=%.10f\n",A1);
}
7、求[10,1600]之间能被7整除的奇数之和。
答案:
90965
main()
{
intjishu,s=0;
for(jishu=11;jishu<=1600;jishu+=2)
if(jishu%7==0)
s+=jishu;
printf("%d\n",s);
}
8、函数mystrlen(char*s)的功能是求字符串s的长度。
请填空。
Intmystrlen(char*s)
{intnum=0;
while(){____;}
return();
}
9、[100,500]之间同时满足除以7余5,除以5余3,除以3余1的整数之和。
答案:
1042
main()
{
intshu,s=0;
for(shu=100;shu<=500;shu++)
if(shu%7==5&&shu%5==3&&shu%3==1)
s+=shu;
printf("%d\n",s);
}
10、求[100,999]之间所有的素数的个数。
答案:
143
intsu_shu(intshu)
{
inti;
for(i=2;i{
if(shu%i==0)
return0;
else
return1;
}
}
main()
{
intshu,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位数。
答案:
110
main()
{
intshu,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("%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];
printf("%ld\n",sum);
}
for(j=1;j<=10;j++)改为for(j=0;j<10;j++)或者for(j=0;j<=9;j++)
因为前面赋值时数组下标是从0开始的
13、/*求1到2000之间的双胞胎数的对数。
双胞胎数:
两素数差为2称为双胞胎数。
例如227和229是一对双胞胎数,它们都是素数且差为2。
*/答案:
61
#include
intprime(intx)
{
intk;
for(k=2;kif(__________)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(__________)n++;
}
}
printf("%d\n",n);
}第一空:
if(x%k==0)break;
第二空:
if(prime(b)==1)n++;
14、编写程序,统计200~400之间的所有满足三个数字之积为42,三个数字之和为12的数的个数。
答案:
4
intPanDuan(intshu)
{
intge,shi,bai;
ge=shu%10;
shi=shu%100/10;
bai=shu/100;
if((ge*shi*bai==42)&&(ge+shi+bai==12))
return1;
else
return0;
}
main()
{
intshu,n=0;
for(shu=200;shu<=400;shu++)
if(PanDuan(shu)==1)
n++;
printf("%d\n",n);
}
15、有30个学生一起买小吃,共花钱50元,其中每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数为0的解)?
答案:
9
main()
{
intda,zhong,n=0;
for(da=1;da<=30-1-1;da++)
{
for(zhong=1;zhong<30-1-da;zhong++)
{
if(3*da+2*zhong+1*(30-da-zhong)==50)
n++;
}
}
printf("%d\n",n);
}
16、爱因斯坦走台阶:
有一台阶,如果每次走两阶,最后剩一阶;如果每次走三阶,最后剩两阶;如果每次走四阶,最后剩三阶;如果每次走五阶,最后剩四阶;如果每次走六阶,最后剩五阶;如果每次走七阶,刚好走完.求满足上述条件的最小台阶数是多少?
答案:
119ain()
{
intshu=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("%d\n",shu);
}
17、/*求1000以内最大的10个素数的和。
*/答案:
9664
#include
intprime(longn)
{
longk;
for(k=2;k<=n-1;k++)
if(____________)return0;
return1;
}
voidmain()
{
longt,total=0,num=0;
intprime(longn);
for(t=1000;t>=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
longjc(longx)
{
longk,fac=1;
for(k=1;________;k++)
fac*=k;
________;
}
voidmain()
{
longn,sum=0;
longjc(longx);
for(n=1;n<=7;n++)
________;
printf("\n%ld",sum);
}第一空:
for(k=1;k<=x;k++)//循环x次;累乘即为x的阶乘
第二空:
returnfac;//返回阶乘值
第三空:
sum=sum+jc(n);//阶乘值累加
19、求10000以内所有完数之和,"完数"是指:
一个数如果刚好与它所有的真因子(不包括该数本身)之和相等,如:
6=1+2+3,则6就是一个完数。
(注:
所有变量用int数据类型定义!
)答案:
8658intPanDuan(intshu)
{
inthe=0,i=1;
for(i=1;iif(shu%i==0)
he+=i;
if(he==shu)
return1;
else
return0;
}
main()
{
inti,s=0;;
for(i=0;i<=10000;i++)
if(PanDuan(i)==1)
s+=i;
printf("%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项。
请改正程序中的错误,并运行修改后的程序,给出程序结果。
(注:
只有一处错误!
)*/答案:
1323525
#include
#include
#defineN30
voidmain()
{
longa[N];
intk;
clrscr();
a[0]=1;a[1]=2;a[2]=1;
for(k=3;k<=20;k++)
a[k]=a[k-1]+a[k-2]+a[k-3];
printf("%ld\n",a[k-1]);
}for(k=3;k<=20;k++)改为for(k=3;k<=24;k++)因为第25项为a[24]
循环出来后k=25,故输出时应输出a[k-1]
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(___________)return1;
elsereturn0;
}
voidmain()
{
longk,s=0;
inthws(longn);
for(k=200;k<=2000;k++)
if(___________)
s=s+k;
printf("\n%ld",s);
}第一空:
if(t==n)return1;//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*2*3*...*n)/(3*5*7*...(2*n+1))请将程序补充完整,并给出当n=25时,程序的运行结果(按四舍五入保留10位小数)。
*/答案:
1.5707963267
#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);
_________________
}
returnrtn;
}
voidmain()
{
doublesum;
__________
printf("\n%.10lf",sum);
}第一空:
rtn=rtn+t/s;
第二空:
sum=fun(25);
23、已知:
Sn=2/1+3/2+4/3+…+(n+1)/n,求Sn不超过50的最大值(按四舍五入的方式精确到小数点后第三位)。
答案:
49.395main()
{
floatSn=0,n=0;
while(Sn<=50)
{
n++;
Sn=Sn+(n+1)/n;
}
Sn=Sn-(n+1)/n;//跳出循环时Sn大于50,
//减去最后一次所加值即得符合要求的最大数
printf("%.3f\n",Sn);
}
24、计算Y=X/1!
-X^3/3!
+X^5/5!
-X^7/7!
+……前20项的值(已知:
X=2)。
要求:
按四舍五入的方式精确到小数点后第二位。
答案:
0.91/*开始总是调试不出,后来才意识到是程序中涉及到的数据很大,均设为双精度型变量*/
#include
doubleMi(doublem,intn)//求m的n次方函数
{
inti;
doublex=1.0;
for(i=1;i<=n;i++)
x*=m;
returnx;
}
doubleJiecheng(intn)//求n的阶乘函数
{
inti;
doublex=1.0;
for(i=1;i<=n;i++)
x*=i;
returnx;
}
main()
{
inti;
doubley=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)为幂分子,Jiecheng(2*i-1)为阶乘分母
y+=n;//各项和
}
printf("%.2f\n",y);//四舍五入保留两位小数输出
}
25、若某正整数平方等于某两个正整数平方之和,称该正整数为弦数。
例:
3^2+4^2=5^2,则5为弦数,求[131,200]之间最小的弦数。
答案:
135#include
//方法1
main()
{
intx,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)gotoEnd;//只求满足条件的最小数,故一旦满足条件,则退出所有循环
End:
//退出循环
printf("%d\n",z);//输出满足条件的最小数
}
//方法2
/*
main()
{
intx,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("%d\n",shu);//输出满足条件的最小数
}
*/
26、已知X,Y,Z为三个正整数,且X^2+Y^2+Z^2=25^2,求X+Y+Z的最大值。
答案:
43#include
main()
{
intx,y,z,max=0;
for(x=1;x<=25;x++)
for(y=1;y<=25;y++)
for(z=1;z<=25;z++)//循环对x、y、z赋值
if(x*x+y*y+z*z==25*25)//判断是否满足条件
if(x+y+z>max)max=x+y+z;//取满足条件的所有各数和的最大值
printf("%d\n",max);//输出满足条件的所有各数和的最大值
}
27、猴吃桃:
有一天小猴子摘下了若干个桃子,当即吃掉一半,还觉得不过瘾,又多吃了一个。
第二天接着吃了剩下的桃子中的一半,仍不过瘾,又多吃了一个。
以后每天都是吃尚存桃子的一半零一个。
到第10天早上小猴子再去吃桃子时,看到只剩下一个桃子了。
问小猴子第一天共摘下了多少个桃子。
答案:
1534/*纯粹是个数学题,计算思路出来了,程度也就出来了*/
#include
main()
{
inti,n=1;//n为剩余桃子个数,第十天为1个
for(i=1;i<=9;i++)//小猴子吃了9天的桃子
{
n=2*(n+1);//前一天剩余的桃子数是今天剩余桃子数加1的两倍
}
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()
{
inta,b,c;//定义三角形的三条边长度为整型变量
intn=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("%d\n",n);//输出满足条件的组数
}
29、15元钱换成1元、2元、5元的票面,问有多少种不同的兑换方法?
输出所有的兑换方法。
答案:
18种#include
main()
{
inti=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%4d\n",k,j,i);
n++;//如果满足