C程序设计(第五版)谭浩强 著——第五章 循环结构程序设计 书后题答案

1.请画出例5.6中给出的3个程序段的流程图。
在这里插入图片描述
2.请补充例5.7程序,分别统计当“fabs(t)>=1e-6”和“fabs(t)>=1e-8”时执行循环体的次数。

#include<stdio.h>
#include<math.h>
void main()
{
    int sign=1;//符号
    int count=0;//计数
    double pi=0.0,n=1.0,term=1.0;//pi多项式,n分母,term当前项
    while(fabs(term)>=1e-6)//fabs(term)>=1e-8
    {
        pi+=term;
        n+=2;
        sign=-sign;
        term=sign/n;
        count++;
    }
    pi*=4;
    printf("pi=%10.6f count=%d\n",pi,count);
    //printf("pi=%10.8f count=%d\n",pi,count);
}

在这里插入图片描述
在这里插入图片描述
3.输入两个正整数m和n,求其最大公约数和最小公倍数。

#include<stdio.h>
void main()
{
    int m,n,t,p;//t,p中间变量
    printf("请输入两个正整数m和n:");
    scanf("%d%d",&m,&n);
    p=m*n;
    while(n!=0)
    {
        t=m%n;
        m=n;
        n=t;
    }
    printf("最大公约数=%d\n",m);
    printf("最小公倍数=%d\n",p/m);
}

在这里插入图片描述
4.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

#include<stdio.h>
void main()
{
    int c1=0,c2=0,c3=0,c4=0;//分别统计四种字符的数量
    printf("请输入字符串:");
    for(char a;(a=getchar())!='\n';)//加括号,关系运算符的优先级大于赋值运算符
    {
        if((a>='A'&&a<='Z')||(a>='a'&&a<='z'))
            c1++;
        else if(a==' ')
            c2++;
        else if(a>='0'&&a<='9')
            c3++;
        else
            c4++;
    }
    printf("英文字母的个数=%d\n空格的个数=%d\n数字的个数=%d\n其他字符的个数=%d\n",c1,c2,c3,c4);
}

在这里插入图片描述
5.求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:2+22+222+2222+22222(此时n=5)

#include<stdio.h>
void main()
{
    int a,n,t=0,S=0;//中间量t
    printf("Please input a&n:");
    scanf("%d%d",&a,&n);
    for(int i=0;i<n;i++)
    {
        t=t*10+a;
        S+=t;
    }
    printf("Sn=%d\n",S);
}

在这里插入图片描述
6.求1!+2!+3!+4!+…+20!。

#include<stdio.h>
void main()
{
    float n=1,sum=0;//定义成int型产生溢出
    for(int i=1;i<=20;i++)
    {
        n*=i;
        sum+=n;
    }
    printf("sum=%f\n",sum);
}

在这里插入图片描述
7.求(1+2+…+100)+(1^ 2+2^ 2+…+50^ 2)+(1/1+1/2+…+1/10)。

#include<stdio.h>
void main()
{
    int n2,s1=0,s2=0;
    float n3,s3=0.0,s;
    for(int i=1;i<=100;i++)
    {
        s1+=i;
        if(i<=50)
        {
            n2=i*i;
            s2+=n2;
        }
        if(i<=10)
        {
            n3=1.0/(float)i;
            s3+=n3;
        }
    }
    s=s3+(float)s2+(float)s1;
    printf("s=%f\n",s);
}

在这里插入图片描述
8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数。

#include<stdio.h>
void main()
{
    int a,b,c;//分别存放个位、十位、百位
    for(int i=100;i<=999;i++)
    {
        a=i%10;
        b=(i%100)/10;
        c=i/100;
        if(a*a*a+b*b*b+c*c*c==i)
            printf("%d ",i);
    }
}

在这里插入图片描述
9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1,2,3

#include<stdio.h>
void main()
{
    for(int i=2;i<=1000;i++)
    {
        int sum=1;//因子的和
        for(int j=2;j<=i/2;j++)
        {
            if(i%j==0)
                sum+=j;
        }
        if(i==sum)
        {
            printf("%d its factors are 1",i);
            for(int j=2;j<=i/2;j++)
            {
                if(i%j==0)
                    printf(",%d",j);
            }
            printf("\n");
        }
    }
}

在这里插入图片描述
10.有一个分数序列,求出这个数列的前20项之和。
2/1,3/2,5/3,8/5,13/8,21/13,…

#include<stdio.h>
void main()
{
    float term,sum=0.0;//term每项,sum和
    int f1=1,f2=2,t;
    for(int i=0;i<20;i++)
    {
        term=(float)f2/(float)f1;
        sum+=term;
        t=f1;//1、2
        f1=f2;//2、3
        f2=t+f2;//3、5
    }
    printf("sum=%f\n",sum);
}

在这里插入图片描述
11.一个球从100m高度落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

#include<stdio.h>
void main()
{
    float h=100.0,s=100.0;//h代表高度 s代表路程
    for(int i=0;i<10;i++)
    {
        if(i>=1)
            s+=2*h;
        h/=2;
    }
    printf("第10次落地时共经过%f米\n第10次反弹高度为%f米\n",s,h);
}

在这里插入图片描述
12. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,就只剩一个桃子了。求第一天共摘多少个桃子。

#include<stdio.h>
void main()
{
    int n=1;//表示桃子的总数
    for(int i=0;i<9;i++)
    {
        n=(n+1)*2;
    }
    printf("第一天一共摘了%d个桃子\n",n);
}

在这里插入图片描述
13.用迭代法求x=根号a。求平方根的迭代公式为
Xn+1=1/2(Xn+a/Xn)
要求前后两次求出的x的差的绝对值小于10^(-5)

#include<stdio.h>
#include<math.h>
void main()
{
    double a,x0,x1;
    printf("Please input a:");
    scanf("%lf",&a);
    x0=a/2;
    x1=(x0+a/x0)/2;
    while(fabs(x1-x0)>=1e-5)
    {
        x0=x1;
        x1=(x0+a/x0)/2;
    }
    printf("%lf的平方根为%lf\n",a,x1);
}

在这里插入图片描述

14.用牛顿迭代法求下面方程在1.5附近的根:
2x^3 - 4x^2 + 3x - 6 = 0

#include<stdio.h>
#include<math.h>
void main()
{
    double x0,x1,f,f1;
    x0=1.5;
    f=((2*x0-4)*x0+3)*x0-6;
    f1=(6*x0-8)*x0+3;
    x1=x0-f/f1;
    while(fabs(x1-x0)>=1e-5)
    {
        x0=x1;
        f=((2*x0-4)*x0+3)*x0-6;
        f1=(6*x0-8)*x0+3;
        x1=x0-f/f1;
    }
    printf("1.5附近的实根为%lf\n",x1);
}

在这里插入图片描述

15.用二分法求下面方程在(-10,10)的根:
2x^3 - 4x^2 + 3x - 6 = 0

#include<stdio.h>
#include<math.h>
void main()
{
    double x0,x1,x2,f0,f1,f2;
    do{
        printf("enter x1&x2:");
        scanf("%lf%lf",&x1,&x2);
        f1=((2*x1-4)*x1+3)*x1-6;
        f2=((2*x2-4)*x2+3)*x2-6;
    }while(f1*f2>0);
    do{
        x0=(x1+x2)/2;
        f0=((2*x0-4)*x0+3)*x0-6;
        if(f0*f1<0)
        {
            x2=x0;
            f2=f0;
        }
        else
        {
            x1=x0;
            f1=f0;
        }
    }while(fabs(f0)>=1e-5);
    printf("%lf",x0);
}

在这里插入图片描述

16.输出以下图案:

   *
  ***
 *****
*******
 *****
  ***
   *
#include<stdio.h>
void main()
{
    int i,j,k;
    for(i=0;i<4;i++)
    {
        for(j=0;j<=2-i;j++)
        {
            printf(" ");
        }
        for(k=0;k<2*i+1;k++)
        {
            printf("*");
        }
        printf("\n");
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<i+1;j++)
        {
            printf(" ");
        }
        for(k=0;k<5-2*i;k++)
        {
            printf("*");
        }
        printf("\n");
    }
}

在这里插入图片描述

17。两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。以抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。

#include<stdio.h>
void main()
{
    for(char i='X';i<='Z';i++)
    {
        for(char j='X';j<='Z';j++)
        {
            if(i!=j)
            {
                for(char k='X';k<='Z';k++)
                {
                    if(i!=k&&j!=k)
                    {
                        if(i!='X'&&k!='X'&&k!='Z')
                        {
                            printf("A--%c\nB--%c\nC--%c\n",i,j,k);
                        }
                    }
                }
            }
        }
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值