C语言程序设计第三版谭浩强主编第68章课后习题答案.docx
《C语言程序设计第三版谭浩强主编第68章课后习题答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第三版谭浩强主编第68章课后习题答案.docx(59页珍藏版)》请在冰豆网上搜索。
C语言程序设计第三版谭浩强主编第68章课后习题答案
C语言第6—8章课后习题答案
第六章循环语句
6.1输入两个正数,求最大公约数和最小公倍数.
#include
voidmain()
{inta,b,num1,num2,temp;
printf("请输入两个正整数:
\n");
scanf("%d,%d",&num1,&num2);
if(num1{
temp=num1;
num1=num2;
num2=temp;
}
a=num1,b=num2;
while(b!
=0)
{
temp=a%b;
a=b;
b=temp;
}
printf("它们的最大公约数为:
%d\n",a);
printf("它们的最小公倍数为:
%d\n",num1*num2/a);
}
编译已通过
6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.
解:
#include
voidmain()
{
charc;
intletters=0,space=0,degit=0,other=0;
printf("请输入一行字符:
\n");
while((c=getchar())!
='\n')
{
if(c>='a'&&c<='z'||c>'A'&&c<='Z')
letters++;
elseif(c=='')
space++;
elseif(c>='0'&&c<='9')
digit++;
else
other++;
}
printf("其中:
字母数=%d空格数=%d数字数=%d其它字符数=%d\n",letters,space,digit,other);
}
6.3求s(n)=a+aa+aaa+…+aa…a之值,其中a是一个数字,n表示a的位数。
解:
voidmain()
{
inta,n,count=1,sn=0,tn=0;
printf("请输入a和n的值:
\n");
scanf("%d,%d",&a,&n);
printf("a=%dn=%d\n",a,n);
while(count<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}
printf("a+aa+aaa+…=%d\n",sn);
}
6.4求(即1+2!
+3!
+4!
+…+20!
)
voidmain()
{
floatn,s=0,t=1;
for(n=1;n<=20;n++)
{
t=t*n;
s=s+t;
}
printf("1!
+2!
+…+20!
=%e\n",s);
}
阶乘利用递归,再求和:
#include
usingnamespacestd;
longFunc(intn)
{
if(1==n)
returnn;
if(n>1)
returnn*Func(n-1);
}
main()
{
longs=0;
inti=1;
while(i<=6)
{
s=s+Func(i);
i++;
}
cout<
}
6.5求。
voidmain()
{
intk,N1=100,N2=50,N3=10;
floats1=0.0,s2=0.0,s3=0.0;
for(k=1;k<=N1;k++)/*计算1到100的和*/
{
s1=s1+k;
}
for(k=1;k<=N2;k++)/*计算1到50各数平方和*/
{
s2=s2+k*k;
}
for(k=1;k<=N3;k++)/*计算1到10各数倒数之和*/
{
s3=s3+1.0/k;
}
printf("总和=%8.2f\n",s1+s2+s3);
}
已通过
intmain()
{
intk=1,i=11,j=51;
floats=0.0;
while(k<=10)
{
s=s+k+k*k+1.0/k;
while(k==10&&i<=50)
{
s=s+i+i*i;
while(i=50&&j<=100)
{
s=s+j;
j++;
}
i++;
}
k++;
}}
6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。
#include
voidmain()
{
inti,j,k,n;
printf("水仙花数是:
\n");
for(n=100;n<1000;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%d\n",n);
}
}
printf("\n");
}
编译已通过153370371407
6.7一个数如果恰好等于它的因子之和,这个数就称为“完数”。
编程序找出1000之内的所有完数,并按下面格式输出其因子。
#include
#defineM1000/*定义寻找范围*/
voidmain()
{
intk0,k1,k2,k3,k4,k5,k6,k7,k8,k9;
inti,j,n,s;
for(j=2;j<=M;j++)
{
n=0;s=j;
for(i=1;i{
if((j%i)==0)
{
n++;
s=s-i;
switch(n)/*将每个因子赋给k0,k1…k9*/
{
case1:
k0=i;break;
case2:
k1=i;break;
case3:
k2=i;break;
case4:
k3=i;break;
case5:
k4=i;break;
case6:
k5=i;break;
case7:
k6=i;break;
case8:
k7=i;break;
case9:
k8=i;break;
case10:
k9=i;break;
}}}
if(s==0)
{
printf("%d是一个完数,它的因子是",j);
if(n>1)
printf("%d,%d",k0,k1);
if(n>2)
printf(",%d",k2);
if(n>3)
printf(",%d",k3);
if(n>4)
printf(",%d",k4);
if(n>5)
printf(",%d",k5);
if(n>6)
printf(",%d",k6);
if(n>7)
printf(",%d",k7);
if(n>8)
printf(",%d",k8);
if(n>9)
printf(",%d",k9);
printf("\n");
}}}
方法二:
此题用数组方法更为简单.
voidmain()
{intk[10];
inti,j,n,s;
for(j=2;j<=1000;j++)
{
n=-1;
s=j;
for(i=1;i{
if((j%i)==0)
{
n++;
s=s-i;
k[n]=i;/*将每个因子赋给k0,k1...k9*/
}
}
if(s==0)
{
printf("%d是一个完数,它的因子是:
",j);
for(i=0;iprintf("%d,",k[i]);
printf("%d\n",k[n]);
}}}
6.8有一个分数序列:
2/1,3/2,5/3,8/5,13/8,21/13,…求出这个数列的前20项之和.
解:
#include
voidmain()
{
intn,t,number=20;
floata=2,b=1,s=0;
for(n=1;n<=number;n++)
{
s=s+a/b;
t=a,a=a+b,b=t;
}
printf("总和=%9.6f\n",s);
}
编译已通过=32.
6.9球反弹问题
#include
voidmain()
{
floatsn=100.0,hn=sn/2;
intn;
for(n=2;n<=10;n++)
{
sn=sn+2*hn;/*第n次落地时共经过的米数*/
hn=hn/2;/*第n次反跳高度*/
}
printf("第10次落地时共经过%f米\n",sn);
printf("第10次反弹%f米.\n",hn);
}
编译已通过
经过299.m
反弹0.m
6.10猴子吃桃问题
#include
voidmain()
{
intday,x1,x2;
day=9;
x2=1;
while(day>0)
{
x1=(x2+1)*2;
x2=x1;
day--;
}
printf("桃子总数=%d\n",x1);
}
编译已通过=1534
上面的程序是从最后一天计算,一直到第一天。
当while第一次循环,既day=9的时候,X1此时计算的是第9天的桃子数。
而X2既是X1前一天的桃子数。
计算出第9天的桃子数后,把X1的值赋值给X2,那么X2此时X2就表示第9天的桃子数,再通过while的循环,可以逐步求出第7天,第6天...一直到第一天的桃子数.这里X2=X1,就是一个赋值的过程,为的是求前一天的桃子数.
6.11用迭代法求x=。
求平方根的迭代公式为:
要求前后两次求出的差的绝对值小于0.00001。
#include
#include
voidmain()
{
floatx0,x1,a;
scanf("%f",&a);
x1=a/2;
do
{
x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x0-x1)>=0.00001);
printf("%.3f\n",x1);
}编译已通过
6.12用牛顿迭代法求方程在1.5附近的根。
#include
voidmain()
{
doublex,y;x=1.5;
do
{
y=2*x*x*x-4*x*x+3*x-6;
x=x-y/(6*x*x-8*x+3);
}while(y!
=0);
printf("x=%.3f\n",x);
}编译已通过x=2.000
6.13用二分法求方程在(-10,10)之间的根:
#include
voidmain()
{
doublex1,x2,y1,y2;x1=-10;x2=10;
do
{
y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
x1=x1-y1/(6*x1*x1-8*x1+3);
}while(y1!
=0);
do
{
y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
x2=x2-y2/(6*x2*x2-8*x2+3);
}while(y2!
=0);
printf("x1=%.3f,x2=%.3f\n",x1,x2);
}
编译已通过
x1=2.000,x2=2.000
6.14打印图案
#include
voidmain()
{
inti,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf("");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf("");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("\n");
}}
编译已通过
6.15乒乓比赛
#include
voidmain()
{
chari,j,k;/*i是a的对手;j是b的对手;k是c的对手*/
for(i='x';i<='z';i++)
{
for(j='x';j<='z';j++)
{
if(i!
=j)
for(k='x';k<='z';k++)
{
if(i!
=k&&j!
=k)
{
if(i!
='x'&&k!
='x'&&k!
='z')
printf("顺序为:
\na--%c\tb--%c\tc--%c\n",i,j,k);
}}}}
}编译已通过
7.1用筛选法求100之内的素数.
/*用筛选法求100之内的素数*/
#include
#defineN101
voidmain()
{inti,j,line,a[N];
for(i=2;i6for(i=2;ifor(j=i+1;j{if(a[i]!
=0&&a[j]!
=0)
if(a[j]%a[i]==0)
a[j]=0;
11printf("\n");
for(i=2,line=0;i{if(a[i]!
=0)
{printf("%5d",a[i]);
line++;
if(line==10)
{printf("\n");
line=0;}
}
21}
6,11,21没通过
7.2用选择法对10个数排序.
/*选择法排序.*/
#include
#defineN10
voidmain()
{inti,j,min,temp,a[N];
/*输入数据*/
printf("请输入十个数:
\n");
for(i=0;i{printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("\n");
for(i=0;iprintf("%5d",a[i]);
printf("\n");
/*排序*/
for(i=0;i{min=i;
for(j=i+1;jif(a[min]>a[j])min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
/*输出*/
printf("\n排序结果如下:
\n");
for(i=0;iprintf("%5d",a[i]);
}
编译已通过
7.3对角线和:
/*计算矩阵对角线元素之和*/
#include
#include
voidmain()
{
inta[3][3];
inti,j;//i为行j为列
intsum=0;
intsum1=0;
//输入
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
printf("请输入第%d行第%d列的数:
",i+1,j+1);
scanf("%d",&a[i][j]);
}
printf("\n");
}
//求和
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
if(i==j)
sum=sum+a[i][j];
if(i+j==2)
sum1=sum1+a[i][j];
}}
7.4插入数据到数组
/*插入数据到数组*/
#include
voidmain()
{
inta[11]={1,3,6,9,13,15,19,27,30,80};
inttemp1,temp2,number,end,i,j;
printf("初始数组如下:
");
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
printf("输入插入数据:
");
scanf("%d",&number);
end=a[9];
if(number>end)
a[10]=number;
else
{
for(i=0;i<10;i++)
{
if(a[i]>number)
{
temp1=a[i];
a[i]=number;
for(j=i+1;j<11;j++)
{
temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
}}}
for(i=0;i<11;i++)
printf("%6d",a[i]);
printf("\n");
}编译已通过
7.5将一个数组逆序存放。
/*数组逆序存放*/
#include
#defineN5
voidmain()
{
inta[N]={8,6,5,4,1},i,temp;
printf("\n初始数组:
\n");
for(i=0;iprintf("%4d",a[i]);
for(i=0;i{
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("\n交换后的数组:
\n");
for(i=0;iprintf("%4d",a[i]);
}无错误
7.6杨辉三角
/*打印杨辉三角形*/
#include
#defineN10
voidmain()
{
inti,j,a[N][N];
for(i=0;i{
a[i][i]=1;
a[i][0]=1;
}
for(i=2;ifor(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i{
for(j=0;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");
}
printf("\n");
}
7.8鞍点
/*查找鞍点*/
#defineN10
#defineM10
main()
{inti,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;
printf("\n输入行数n:
");
scanf("%d",&n);
printf("\n输入列数m:
");
scanf("%d",&m);
for(i=0;i{printf("第%d行?
\n",i);
for(j=0;jscanf("%d",&a[i][j];
}
for(i=0;i{for(j=0;jprintf("%5d",a[i][j]);
pritf("\n");
}
flag2=0;
for(i=0;i{max=a[i][0];
for(j=0;jif(a[i][j]>max)
{max=a[i][j];
maxj=j;
}
for(k=0,flag1=1;kif(max>a[k][max])
flag1=0;
if(flag1)
{printf("\n第%d行,第%d列的%d是鞍点\n",i,maxj,max);
flag2=1;
}}
if(!
flag2)
printf("\n矩阵中无鞍点!
\n");
}
7.9变量说明:
top,bott:
查找区间两端点的下标;loca:
查找成功与否的开关变量.
/*折半查找*/
#include
#defineN15
main()
{inti,j,number,top,bott,min,loca,a[N],flag;
charc;
printf("输入15个数(a[i]>[i-1])\n);
scanf("%d",&a[0]);
i=1;
while(i{scanf("%d",&a[i]);
if(a[i]>=a[i-1])
i++;
esle
{printf("请重输入a[i]");
printf("必须大于%d\n",a[i-1]);
}
}
printf("\n");
for(i=0;iprintf("%4d",a[i]);
printf("\n");
flag=1;
while(flag)
{
printf("请输入查找数据:
");
scanf("%d",&number);
loca=0;
top=0;
bott=N-1;
if((numbera[N-1]))
loca=-1;
while((loca==0)&&(top<=bott))
{min=(bott+top)/2;
if(number==a[min])
{loca=min;
printf("%d位于表中第%d个数\n",number,loca+1);
}
elseif(numberbott=min-1;
else
top=min+1;
}
if(loca==0||loca==-1)
printf("%d不在表中\n",number);
printf("是否继续查找?
Y/N!
\n");
c=getchar();
if(c=='N'||c=='n')
flag=0;
}
}
7.10/*统计字符数*/
#include
voidmain()
{inti,j,uppn,lown,dign,sp