C程序设计(谭浩强)第五版课后题答案 第五章
作者:互联网
1.请画出例5.6中给出的3个程序段的流程图
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; }
标签:main,include,int,x1,mid,谭浩强,课后,printf,第五版 来源: https://www.cnblogs.com/lazyheartkx/p/16280799.html