C语言程序设计第五版谭浩强著 第五章137-138习题以及答案

3.求两个正整数m和n,求其最大公约数和最小公倍数。

#include<stdio.h>
main()
{
    int m,n,t,i,a=1;
    scanf("%d%d",&m,&n);
    if(m<n) 
    {
        t=m;
        m=n;
        n=t;
    }
    for(i=2;i<=n;i++)
    {
            if(m%i==0&&n%i==0) 
            a=i;
    }
printf("最大公约数是:%d\n",a);
t=(m*n)/a;
printf("最小公倍数是:%d",t);

}

4.输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。

#include<stdio.h>
main()
{
    char c;
    int i=0,j=0,k=0,l=0;
    while((c=getchar())!='\n')
    {
     if(c>=65&&c<=90||c>=97&&c<=122)
        i++;
    else if(c>=48&&c<=57)
        j++;
    else if(c==32)
        k++;
    else 
        l++;
    }
        printf("字母%d个\t空格%d个\t数字%d个\t其他字符%d个\n",i,j,k,l); 
}

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

#include<stdio.h>
#include<math.h>
main()
{
    int a,n,sum=0,i=1;
    scanf("%d%d",&a,&n);
    while(i<=n)
    {
        sum=sum+a;
        a=a+2*pow(10,i);
        i++;
    }
    printf("%d",sum);
}
20

6.求 ∑n! (即求1!+2!+3!+4!+……+20!).
n=1

#include<stdio.h>
int main()
{
    int n;
    int s=1,sum=0;
    for(n=1;n<=20;n++)
{
    s=s*n;
    sum=sum+s;
}
    printf("sum=%d\n",sum);
}
100   50   10

7.求 ∑k + ∑k^2 + ∑1/k
k=1 k=1 k=1

#include<stdio.h>
main()
{
    int k1=1,k2=1,k3=1;
    int s1=0,s2=0,s3=0,sum;
    for(k1=1;k1<=100;k1++) s1=s1+k1;
    for(k2=1;k2<=50;k2++) s2=s2+k2*k2;
    for(k3=1;k3<=10;k3++) s3=s3+(1/k3);
    sum=s1+s2+s3;
    printf("%d",sum);
}

8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1^3+5^3+3^3。

#include<stdio.h>
#include<math.h>
main()
{
    int x=100,a,b,c;
    while(100<=x&&x<1000)
    {
        a=0.01*x;b=10*(0.01*x-a);c=x-(a*100)-(b*10);
        if(x==pow(a,3)+pow(b,3)+pow(c,3))
        printf("%5d",x);
        x++;
    }
}

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

#include<stdio.h>
void main()
{
int i,j,s;
 for(i=2;i<=1000;i++)
 {
    s=0;
   for(j=1;j<i;j++)
   {
      if(i%j==0) 
        s=s+j;//数字i的真因子之和 
        }
            if(i==s)//如果数字i因子之和=i 
            {
                printf("%d its factors are ",i);//输出完美数 
                for(j=1;j<i;j++)
                {
                    if(i%j==0) 
                    printf("%d,",j);//输出完美数真因子 
                }
                    printf("\n");
          }
    }
}

10.有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13….. 求出这个数列前20项之和。

#include<stdio.h>
main()
{
    int i;
    float n=1,m=2,t,s,sum=0;
    for(i=1;i<=20;i++)
    {
        s=m/n;
        sum=sum+s;
        t=m;m=m+n;n=t;

    }
    printf("%f\n",sum); 
}

11.一个球从100m高度自由落下,每次落地后反弹回原来高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

#include<stdio.h>
main()
{
    int n;
    double h=100,s=100;
    for(n=1;n<=10;n++)
    {
        h*=0.5;if(n==1) continue;s=2*h+s;
    }
    printf("第10次一共经过%.2f米,反弹%.2f米",s,h);
}

12.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,好不过瘾,又多吃了一个。第二天早上又吃了剩下的桃子的一半,又多吃了一个。以后每天都吃了前一天剩下的一半零一个,到第10天早上想再吃的时候,就剩下一个桃子。求第一天共摘多少个桃子。

#include<stdio.h>
main()
{
    int i=1,sum=0;
    for(;i<=10;i++)
    sum=sum*2+1;
    printf("%d\n",sum);
}
  1. 迭代法求a平方根

已知求平方根的迭代公式为:x n+1 = (xn + a / xn) / 2
要求前后两次求出的差的绝对值小于10-5。

#include"stdio.h"
#include"math.h"
void main()
{
float x1=1,x2,a;
printf("input a\n");
scanf("%f",&a);
x2=a;
while(fabs(x1-x2)>=1e-5)
{
x1=x2;
x2=(x1+a/x1)/2;
}
printf("%f,%f",x1,x2);
}

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

#include<stdio.h>
#include<math.h>
int main()
{
    int i=0;
    double x1=1.5,x2=0;//迭代初值
    while (fabs(x2-x1)>=1e-5)
    {
        x1=x1-(2*x1*x1*x1-4*x1*x1+3*x1-6)/(6*x1*x1-8*x1+3);
        x2=x1-(2*x1*x1*x1-4*x1*x1+3*x1-6)/(6*x1*x1-8*x1+3);

        i++;
        printf("第%d次迭代  x1=%9.8f\tx2=%9.8f\n",i,x1,x2);
    }
    printf("\nx=%9.8f\t共迭代:%d次\n",x2,i);
    return 0;
}

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

#include <stdio.h>
#include <math.h>
int main()
{
    double a=-10, b=10, c, x, x1, x2, x3;
    for (int i=0; ; i++){
        c=(a+b)/2;
        x1=2*pow(a, 3)-4*pow(a, 2)+3*a-6;
        x2=2*pow(b, 3)-4*pow(b, 2)+3*b-6;
        x3=2*pow(c, 3)-4*pow(c, 2)+3*c-6;
        if (!x3) x=c;
        else if (x1*x3<0) b=c;
        else if (x2*x3<0) a=c;
        if (fabs(a-b)<1e-8){
            x=a;
            break;
        }
    }
    printf("Root=%lf\n", fabs(x));
    return 0;
}

16.输出以下图案:
*






*

#include<stdio.h>
main()
{
    int i,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");
    }
}

17.两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

#include <stdio.h>  
int main()
 {
  char i,j,k;            /*是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("A--%c\nB--%c\nC--%c\n",i,j,k);
   return 0;
  }
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值