编程语言
首页 > 编程语言> > C程序设计(谭浩强)第五版课后题答案 第五章

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