大家好,这篇文章分享了C程序设计(谭浩强)第五版第五章课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家
1.
2.
3.
2.请补充例5. 7程序,分别统计当“fabs(t)>= le- 6”和“fabs(t)> = le- 8”时执行循环体的次数。
#include <stdio.h>
#include <math.h>
void main()
{
int sign=1,count=0;
double pi=0.0,n=1.0,term=1.0;
while(fabs(term)>=1e-6)
{
pi=pi+term;
n=n+2;
sign=-sign;
term=sign/n;
count++;
}
pi=pi*4;
printf("pi=%10.8f\n",pi);
printf("循环次数为%d\n",count);
return 0;
}
当fabs(t)>=1e-6 时循环50 000次
当fabs(t)>=1e-8 时循环50 000 000次
3.输人两个正整数m和n,求其最大公约数和最小公倍数
#include<stdio.h>
int main()
{
int a,b,c,m;
printf("Please input two numbers:");
scanf("%d %d",&a,&b);
m=a*b;
if(a<b)
{
int r;
r=a;
a=b;
b=r;
}
while(c=(a%b))
{
a=b;
b=c;
}
printf("最大公约数:%d\n最小公倍数:%d\n",b,m/b);
return 0;
}
4.输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include<stdio.h>
int main()
{
int i,j=0,c1=0,c2=0,c3=0,c4=0,word=0,num=0;
char c,a[100];
printf("Please input:\n");
gets(a);
for(i=0;(c=a[i])!='\0';i++)
{
if(c==' ')
num++;
}
while(a[j]!='\0')
{
if(a[j]>='A' && a[j]<='Z')
c1++;
else if(a[j]>='a' && a[j]<='z')
c2++;
else if(a[j]>='0' && a[j]<='9')
c3++;
else
c4++;
j++;
}
printf("大写字母个数:%d\n小写字母个数:%d\n数字个数:%d\n其他字符个数:%d\n空格个数:%d\n",c1,c2,c3,c4,num);
return 0;
}
5.求Sn=a+aa+aaa+$\overbrace{aa+\dots+a}^{n个a}$之值,其中a是一个数字,n表示a的位数,n由键盘输入。 例如: 2+22+222+2222+22222 (此时n=5)
#include<stdio.h>
#include<math.h>
int main()
{
int i,a,n,m=0,sum=0;
printf("请输入数字和数字位数:\n");
scanf("%d %d",&a,&n);
for(i=1;i<=n;i++)
{
m=a*(int)pow(10,i-1)+m;
sum=sum+m;
}
printf("Sn=%d\n",sum);
return 0;
}
6.求 $\sum\limits_{n=1}^{20}n!$ (即求1!+2!+3!+4!+…+20!)。
#include<stdio.h>
int main()
{
long long int i,j,sum=0;
for(i=1;i<=20;i++)
{
long long int sum0=1;
for(j=1;j<=i;j++){
sum0*=j;
}
sum+=sum0;
}
printf("1~20n! sum=%lld\n",sum);
return 0;
}
7.求$\sum\limits_{k=1}^{100}k$+$\sum\limits_{k=1}^{50}{k}^2$+$\sum\limits_{k=1}^{10}{\frac{1}{k}}$。
#include<stdio.h>
int main()
{
double i,j,sum1=0,sum2=0,sum3=0.0;
for(i=1;i<=100;i++)
sum1+=i;
for(i=1;i<=50;i++)
sum2+=i*i;
for(i=1;i<=50;i++)
sum3+=1.0/i;
printf("sum=%lf\n",sum1+sum2+sum3);
return 0;
}
8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=13+53+33。
#include<stdio.h>
int main()
{
int a,b,c,i;
for(i=100;i<=999;i++)
{
a=i/100;
b=(i/10)%10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i)
printf(" %d",i);
}
return 0;
}
9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1,2,3
#include<stdio.h>
int main()
{
int b,c,i,j,m;
for(i=2;i<1000;i++)
{
int a[50]={0};
m=0;
b=0;
for(j=1;j<i;j++)
{
if(i%j==0)
a[m++]=j;
}
for(j=0;j<m;j++)
{
b+=a[j];
}
if(b==i)
{
printf("%d its factors are ",i);
for(j=0;j<m;j++)
printf("%d,",a[j]);
printf("\n");
}
}
return 0;
}
10.有一个分数序列 $\frac{2}{1} \frac{3}{2} \frac{5}{3} \frac{8}{5} \frac{13}{8} \frac{21}{13} $ 求出这个数列的前20项之和。
#include<stdio.h>
int main()
{
float a=2.0,b=1.0,i;
float sum=2.0;
for(i=1;i<20;i++)
{
float t;
t=a;
a=a+b;
b=t;
sum+=(a/b);
}
printf("%f",sum);
return 0;
}
11.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
#include<stdio.h>
int main()
{
float i,a=100.0,sum=0.0;
for(i=0;i<10;i++)
{
sum+=a;
a=a/2;
sum+=a;
}
sum=sum-a;
printf("10次共经历%f米,第10次反弹%f米\n",sum,a);
return 0;
}
12.猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
#include<stdio.h>
int main()
{
int i,a=1;
for(i=1;i<10;i++)
{
a=(a+1)*2;
}
printf("%d\n",a);
return 0;
}
13.用迭代法求x=$\sqrt{a}$求平方根的迭代公式为$x_{n+1}=\frac{1}{2}(x_{n}+\frac{a}{x_n})$要求前后两次求出的x的差的绝对值小于$10^{-5}$。#include<stdio.h>
#include<math.h>
int main()
{
float n1,n2,a;
printf("请输入一个数:\n");
scanf("%f",&a);
n1=a;
n2=(n1+a/n1)/2;
do
{
n1=n2;
n2=(n1+a/n1)/2;
}while(fabs(n2-n1)>1e-6);
printf("%f\n",n2);
return 0;
}
14.用牛顿迭代法求下面方程在1.5附近的根: $2x^3- 4x^2+ 3x- 6= 0$
#include<stdio.h>
#include<math.h>
int main()
{
double x1,x2,x3,n;
n=1.5;
do
{
x1=n;
x2=2*x1*x1*x1-4*x1*x1+3*x1-6;
x3=6*x1*x1-8*x1+3;
n=x1-(x2/x3);
}while(fabs(n-x1)>1e-6);
printf("%lf\n",n);
return 0;
}
15.用二分法求下面方程在(-10,10)的根: $2x^3-4x^2+3x-6= 0$
#include<stdio.h>
#include<math.h>
int main()
{
double l=-10.0,r=10.0,mid;
double temp=10.0;
while(fabs(temp)>1e-5)
{
mid=(l+r)/2;
temp=2*mid*mid*mid-4*mid*mid+3*mid-6;
if(temp<0)
{
l=mid;
}
if(temp>0)
{
r=mid;
}
}
printf("%lf\n",mid);
return 0;
}
16.输出以下图案:
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k;
for(i=1;i<=4;i++)
{
for(j=1;j<=4-i;j++)
{
printf(" ");
}
for(j=1;j<=2*i-1;j++)
printf("*");
printf("\n");
}
for(i=1;i<4;i++)
{
for(j=1;j<=i;j++)
{
printf(" ");
}
for(j=1;j<=7-2*i;j++)
printf("*");
printf("\n");
}
return 0;
}
17.两个乒乓球队进行比赛,各出3人。甲队为A,B,C 3人,乙队为X,Y,Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。
#include<stdio.h>
int main()
{
int i,j,z;
char a[3]={'X','Y','Z'};
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
for(z=0;z<3;z++)
{
if(i==0 || z==0 || z==2) continue;
if(i==j || i==z || j==z) continue;
printf("比赛选手为:\nA vs %c\nB vs %c\nC vs %c\n",a[i],a[j],a[z]);
}
}
}
return 0;
}