C语言程序设计第三版习题库答案Word文档格式.docx
《C语言程序设计第三版习题库答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第三版习题库答案Word文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
intx,y;
scanf("
if(x<
1)
{y=x;
elseif(x>
=1&
&
x<
10)
{y=2*x-1;
else
{y=3*x-11;
printf("
y);
}#include"
%d\n"
}scanf("
}#include"
y=x;
y=2*x-1;
y=3*x-11;
},y);
}
4、给定一个不多于5位的正整数,要求:
①求它是几位数;
②按逆序打印出各位数字。
例如原数为321,应输出123。
main(){
longintnum,m=0;
inti=0;
%ld"
num);
while(num>
0){
i++;
/*统计长度*/
m=m*10+num%10;
num=num/10;
数字长度为:
i);
逆序数字为:
m);
5、以下程序实现的功能:
求三个数的最大值
#include<
inta,b,c,max;
scanf("
%d%d%d"
a,&
b,&
c);
if(a>
b){
c)max=a;
elsemax=c;
}else{
if(b>
c)max=b;
else
max=c;
}
printf("
max=%d"
max);
main(){
intx,y,z,t=0;
x,&
y,&
z);
if(x>
y)
{t=y;
x=t;
z)
{t=z;
z=x;
if(y>
z=y;
y=t;
z);
}
6、输入两个正整数m和n,求其最大公约数和最小公倍数。
/*枚举法*/
main(){
longm,n,i=1,j,s;
%ld,%ld"
m,&
n);
for(;
i<
=m&
=n;
i++){
if(m%i==0&
n%i==0)s=i;
if(m>
=n)j=m;
elsej=n;
!
(j%m==0&
j%n==0);
j++);
s=%ld,j=%ld\n"
s,j);
inta,b,k,temp,i,p;
%d,%d"
b);
if(a>
b)
temp=b;
temp=a;
for(i=2;
=temp;
i++)
{if(a%i==0&
b%i==0)
k=i;
k);
p=a*b/k;
p);
/*辗转相除*/
intm,n,k,j,p,r=1;
k=m>
n?
m:
n;
j=m>
n:
m;
do{
r=k%j;
k=j;
j=r;
}while(r!
=0);
k,m*n/k);
/*反复减法*/
m:
n:
p=k-j;
if(j>
p){k=j;
j=p;
elsek=p;
}while(p!
7、输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include"
charc;
inti=0,j=0,k=0,l=0;
while((c=getchar())!
=’\n’){
if(c>
=’A’&
c<
=’Z’||c>
=’a’&
=’z’)
//英文字母统计
elseif(c>
=’0’&
=’9’)
j++;
//数字统计
elseif(c==’’)
k++;
//空格统计
elsel++;
i=%d,j=%d,k=%d,l=%d\n"
i,j,k,l);
8、求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。
例如:
2+22+222+2222+22222(n=5),n由键盘输入。
inta,n;
longb=0,sum=0;
scanf(“%d%d”,&
for(i=1;
i++){
b=b*10+a;
sum=sum+b;
printf(“%ld”,sum);
9、打印出所有"
水仙花数"
,所谓"
是指一个三位数,其各位数字立方和等于该本身。
153是一个水仙花数,因为153=13+53+33。
【程序1】
inti,m,n,k;
for(i=100;
1000;
m=__i%10__;
n=_i/10%10__;
k=i/100;
if(__m*m*m+n*n*n+k*k*k==i__)
%5d"
【程序2】
inti,a,n,s;
for(i=100;
=999;
n=i;
s=0;
while(n>
0){
a=__n%10__;
s+=a*a*a;
n/=__10__;
if(__s==i__)printf(“%d”,i);
10、一个数如果恰好等于它的因子之和,这个数就称为"
完数"
。
例如,6的因子为1、2、3,而6=1+2+3,因此6是"
编程序找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1、2、3
main(){
inta,i,m;
for(a=1;
a<
=1000;
a++){
for(__i=1,m=0__;
i<
=a/2;
if(!
(a%i))__m+=i__;
if(m==a)printf(“%4d”,a);
11、利用:
?
/4=1-1/3+1/5-1/7+….级数求?
的值,直到最后一项的绝对值小于10-6为止。
求绝对值的函数为fabs()。
#__include<
__
math.h>
inti=1,flag=1;
doublesum=0.0,s;
do{
s=__1.0/(2*i-1)__;
sum+=s*flag;
__flag=-flag__;
}while(__fabs(s)>
1e-6__);
/**/
pi=%f"
__4*sum__);
11、有一分数序列:
2/1,3/2,5/3,求出这个数列的前20项之和。
#defineN20
inti=1;
doublex=1,y=2,sum=0;
while(__i<
=20__){
sum=sum+__y/x__;
y=___x+y__;
x=__y-x__;
i++;
%f\n"
sum);
12、一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。
求它在第10次落地时共经过多少米?
第10次反弹多高?
inti,n=10;
doubleh=100,s=100;
for(i=2;
h*=__0.5__;
s=__s+h*2__;
s=%f,h=%f\n"
s,h);
13、猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘多少桃子。
#defineN10
inti=1,sum=1;
while(i++<
N)
sum=__(sum+1)*2__;
sum=%d\n"
14、用迭代法求。
求平方根的迭代公式为:
要求前后两次求出的得差的绝对值少于0.00001。
floatx0,x1,a;
a);
x1=a/2;
do{
x0=x1;
x1=__(x0+a/x0)/2__;
}while(__x1>
1e-5__);
%g\n"
x1);
15、用牛顿迭代法求方程
在1.5附近的根。
#include__<
#definef(x)2*x*x*x-4*x*x+3*x-6
doublex,y;
x=__1.5__;
y=f(x);
x=x-y/(6*x*x-8*x+3);
}while(fabs(y)>
1e-6);
x=%.3f\n"
x);
16、用二分法求方程
在(-10,10)之间的根
#definef(x)2x*x*x-4*x*x+3*x-6
doublex1=-10,x2=10,x,y;
x=(x1+x2)/2;
y=f(x);
if(y<
0)x1=x;
elsex2=x;
}while(fabs(y)>
x=%g\n"
17、以下程序的功能是:
输入一个百分制成绩,输出一个五级制成绩等级。
例如输入75,输出C。
请完成填空
intscore;
__%d__"
score);
switch(__score/10__){
case1:
case2:
case3:
case4:
case5:
printf(“gradeE\n”);
___break__;
case6:
printf(“gradeD\n”);
break;
case7:
printf(“gradeC\n”);
case8:
printf(“gradeB\n”);
case9:
printf(“gradeA\n”);
__default__:
Errorinput!
\n"
18、该程序功能:
对x=1,2,...,10,求f(x)=x*x-5*x+sin(x)的最大值。
#definef(x)x*x-5*x+sin(x)
voidmain(){
intx;
floatmax;
__max=f
(1)__;
for(x=2;
x<
=10;
x++)
__if(max<
f(x))max=f(x)__;
19、程序功能:
输入整数a和b的值,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。
inta,b,s;
%d%d"
s=__a*a+b*b__;
if(s>
100)printf("
__s/100__);
elseprintf("
___a+b__);
20、有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,以下程序统计卖完所需的天数。
intday,x1,x2;
day=0;
x1=1020;
while(__x1>
0__){
x2=__x1/2-2__;
x1=x2;
day++}
printf(“day=%d”,day);
21、找出整数的所有因子
inti,x;
scanf(“%d”,&
i=1;
for(;
__i<
=x/2__;
){
if(x%i==0)printf(%d”,i);
}
22、统计用数字0-9可以组成多少个各位上的数字没有重复的3位偶数。
intn=0,i,j,k;
for(i=1;
i<
=9;
for(k=0;
k<
=8;
__k+=2__)
if(k!
=i)
for(j=0;
j<
j++)
if(__j!
=i&
j!
=k__)n++;
printf(“n=%d\n”,n);
23、用100元换成1、2、5元的所有兑换方案。
inti,j,k,l=0;
for(i=0;
i<
=20;
for(j=0;
j<
=50;
j++){
k=__(100-i-2*j)/5__;
if(__i+j*2+k*5==100__){
printf(“%2d%2d%2d”,i,j,k);
l=l+1;
if(l%5==0)printf(“\n”);
24、输出1-100之间满足每位数的乘积大于每位数的和的数
intn,k=1,s=0,m;
for(n=1;
n<
=100;
n++){
k=1;
s=0;
__m=n__;
while(__m>
0__){
k*=m%10;
s+=m%10;
___m/=10__;
if(k>
s)printf(“%d”,n);
25、从3个红球、5个白球、6个黑球中任意取出8个球,且其中必须有白球,输出所有可能的方案。
inti,j,k;
for(i=0;
=3;
for(__j=1__;
=5;
j++){
k=8–i–j;
if(__k>
=0__)
printf(“%3d%3d%3d\n”,i,j,k);
26、以下程序的功能是:
判断一个四位数是否满足这样的条件:
它的9倍刚好是它的反序数。
反序数是指整数各个位上的数字逆序所形成的整数。
请完成程序的填空。
inti,a,b,c,d,m;
for(i=1000;
;
a=__i%10__;
b=i/10%10;
c=i/100%10;
d=i/1000;
m=__a*1000+b*100+c*10+d__;
if(___m==i*9__)__break__;
}
printf("
i=%d"
27、以下程序完成两整数的交换。
inta,b;
printf(“请依次输入a,b的值:
”);
scanf(“%d,%d”,__&
b__);
a=a+b;
__b=a-b__;
__a=a-b__;
printf(“交换后:
a=%d,b=%d”,a,b);
28、以下程序的功能是判断输入的年份是否为闰年,若是则输出”yes”,否则输出”No”。
intyear?
scanf(“%d”,&
year);
if(__year%400==0||year%4==0&
year%100!
=0__)printf(“yes”);
elseprintf(“No”);
29、以下程序利用冒泡排序法对输入的10个数进行排序。
voidmain(){
inta[N];
inti,j,t;
printf(″input10numbers:
\n″);
N;
,__&
a[i]__);
for(j=0;
j<
N-1;
for(i=0;
__N-j-1__;
if(__a[i]>
a[i+1]__){
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
printf(″thesortednumbers:
for(i=0;
printf(″%d″,a[i]);
printf(″\n″);
30、用筛法求100之内的素数。
筛法素数的思想是:
1、取最小的数2,并声明它是素数,同时筛去它及它的倍数。
2、取未筛去数中最小的数,并声明它是素数,同时筛去它及它的倍数。
3、重复步骤2至筛中无数,得到所有的素数。
#defineM100//范围
#defineN((M+1)/2)//奇数的个数
voidmain(){
inti,j,a[N];
a[0]=2;
for(i=1;
i++)
/*初始数组实现第一步筛选*/
a[i]=2*i+1;
/*第二步筛选*/
if(__a[i]!
for(j=i+1;
if(__a[j]%a[i]==0__)/*倍数时置零筛去*/
a[j]=0;
\nTheprimerare[2-%d]:
M);
for(i=0,j=0;
i++){
/*显示得到素数*/
=0__)
{
a[i]);
if((++j)%10==0)
/*