循环结构程序设计 习题

作者在 2012-02-24 15:05:38 发布以下内容

5.3 输入两个正整数mn,求其最大公约数和最小公倍数

/*
时间:2011年10月24日12:13:07
题目:习题5-3 输入两个正整数m和n,求其最大公约数和最小公倍数
备注:最小公约数(Least Common Multiple)简写为LCM;最大公约数(greatest common divisor,简写为gcd
*/
# include <stdio.h>

int lcm (int x,int y);
int gcd (int x,int y);

int main()
{
    int a,b;
    int t;
    
    printf("输入两个正整数:");
    scanf("%d%d",&a,&b);
    
    if(a>b)
    {
        t=a;
        a=b;
        b=t;
    }
    
    printf("最小公倍数是%d\n",lcm(a,b));
    printf("最大公约数是%d\n",gcd(a,b));
    
    return 0;
}

//求最小公倍数
int lcm (int x,int y)
{
    int n=1;
    int lcm;
    for(lcm=x;0!=lcm%y;++n)
    {
        lcm = n*x;
    }
    return (lcm);
}
//求最大公约数
int gcd (int x,int y)
{
    
    int t;
    while(x!=0)
    {
        t = y%x;
        y = x;
        x = t;
    }
    return(y);
}
/*
在VC++6.0中的输出结果为:
————————————
输入两个正整数:12 18
最小公倍数是36
最大公约数是6
Press any key to continue
————————————
*/

 

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

/*
时间:2011年10月24日13:48:26
题目:习题5-4 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
*/
# include <stdio.h>

int main()
{
    int space=0;
    int number=0;
    int letters=0;
    int other=0;
    char c;
    printf("输入一串字符:");
    
    
    while((c=getchar())!='\n')
    {
        if((65<=c && c<=90) || (97<=c && c<=122))
        {
            ++letters;
        }
        else if(32==c)
        {
            ++space;
        }
        else if(48<=c && c<=57)
        {
            ++number;
        }
        else
        {
            ++other;
        }
    }
    
    printf("空格有%d个\n",space);
    printf("数字有%d个\n",number);
    printf("字母有%d个\n",letters);
    printf("其他字符有%d个\n",other);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入一串字符:Bccn 2011.11.24
空格有1个
数字有8个
字母有4个
其他字符有2个
Press any key to continue
————————————
*/

 

5.5 Sn=a+aa+aaa+。。。aaaaa(na,)其中a是一个数字,n表示a的位数,例如:2+22+222+2222+22222

/*
时间:2011年10月24日14:09:19
题目:习题5-5 求Sn=a+aa+aaa+。。。aaaaa(n个a,)其中a是一个数字,n表示a的位数
*/
# include <stdio.h>

int main()
{
    int a,n;
    int sn=0;
    int term=0,i;
    
    printf("输入a和n的值:\n");
    printf("a=");
    scanf("%d",&a);
    printf("n=");
    scanf("%d",&n);
    
    for(i=1;i<=n; ++i)
    {
        term = 10*term + a;
        sn += term;
    }
    
    printf("当a=%d,n=%d时,sn=%d\n",a,n,sn);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a和n的值:
a=2
n=5
当a=2,n=5时,sn=24690
Press any key to continue
————————————
*/

 

5.6 1+2+3+…..+20!

/*
时间:2011年10月24日14:39:40
题目:求1!+2!+3!+…..+20!
*/
# include <stdio.h>

double factoria (int x);

int main()
{
    int max=20;
    int i;
    double sn=0;    //注意这里用double型
    
    for (i=1; i<=max; ++i)
    {
        sn += factoria(i);
    }
    printf("sn=%22.15e\n",sn);
    return 0;
}

double factoria (int x)
{
    int i;
    double factoria=1;
    
    for(i=1; i<=x; ++i)
    {
        factoria *= i;
    }
    return (factoria);
}
/*
在VC++6.0中的输出结果为:
————————————
sn=2.561327494111820e+018
Press any key to continue
————————————
*/

5.8 输出所有的水仙花数

/*
时间:2011年10月24日17:00:12
题目:习题5.8 输出所有的水仙花数(3位)
*/
# include <stdio.h>
# include <math.h>

bool IsNarcissus (int number);
int n=3;   //这里只求3位数的水仙花数

int main()
{
    int i;
    for(i=pow(10,n-1); i<pow(10,n); ++i)
    {
        if (IsNarcissus (i))
        {
            printf("%d \n",i);
        }    
    }
    return 0;
}

bool IsNarcissus (int number)
{
    int sum=0;
    int x=number;
    while(x!=0)
    {
        sum += pow((x%10),n);
        x /= 10;
    }
    if (sum == number)
    {
        return true;
    }
    else
    {
        return false;
    }
}
/*
在VC++6.0中的输出结果为:
————————————
153
370
371
407
Press any key to continue
————————————
*/

 

5.9 编程序找出1000以内所有完数

/*
时间:2011年10月25日14:43:51
题目:习题5.9 编程序找出1000以内所有完数
备注:要求输出格式为6 its factors are 1,2,3
*/
# include <stdio.h>

bool IsPerfectNumber (int val,int * pArr);

int main()
{
    int i,k=0;
    int a[100]={0};
    for(i=2;i<1000;++i)
    {
        if(IsPerfectNumber(i,a))
        {
            printf("%d its factors are 1",i);
            for(k=0; k<7; ++k)
            {
                if(a[k]!=0)
                {
                    printf(",%d",a[k]);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

bool IsPerfectNumber (int val,int * pArr)
{
    int i,j,k=0;
    int sum = 1;
    for(j=2;j<=val;++j)
    {
        if(j==val || val%j!=0)
        {
            continue;
        }
        else
        {
            sum += j;
            *(pArr+k)=j;
            ++k;
        }
    }
    if (sum == val)
    {
        return true;
    }
    else
    {
        for(i=0; i<=k; ++i)
        {
            *(pArr+i)=0;
        }
        return false;
    }
}
/*
在VC++6.0中的输出结果为:
————————————
6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
496 its factors are 1,2,4,8,16,31,62,124
Press any key to continue
————————————
*/

 

5.10 有一个分数数列 2/1,3/2,5/3,8/5,13/8,21/13…求前20项的和

/*
时间:2011年10月25日15:09:21
题目:习题5.10 求分数数列前20项和
备注:分数数列为2/1,3/2,5/3,8/5,13/8...
*/
# include <stdio.h>

int main()
{
    int i,n=20;
    double a=2,b=1,sum=0;
    double t;
    
    for(i=1; i<=n; ++i)
    {
        sum += a/b;
        t = a;
        a += b;
        b = t;
    }
        printf("前20项和为%lf\n",sum);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
前20项和为32.660261
Press any key to continue
————————————
*/

 

5.11 有一个球从100高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高

/*
时间:2011年10月25日15:30:44
题目:习题5.11 有一个球从100米高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高
*/
# include <stdio.h>

int main()
{
    double sum = 100.0;
    double high = sum/2;
    int n;
    
    for(n=2; n<=10; ++n)
    {
        sum += 2*high;
        high /= 2;
    }
    printf("第10次落地时小球经过%lf米,第10次反弹的高度是%lf米\n",sum,high);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第10次落地时小球经过299.609375米,第10次反弹的高度是0.097656米
Press any key to continue
————————————
*/

 

5.12猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了

一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天

剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个

桃子。

/*
时间:2011年10月25日15:44:20
题目:习题5.12 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了
      一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天
      剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
*/
# include<stdio.h>

int main()
{
    int peach=1;
    int day;
    
    for(day=9; day>0; --day)
    {
        peach =2*(peach+1);
    }
    printf("第1天猴子摘了%d个桃子\n",peach);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第1天猴子摘了1534个桃子
Press any key to continue
————————————
*/

 

5.13 用迭代法求平方根

/*
时间:2011年10月25日16:08:06
题目:习题5.13 用迭代法求平方根
公式:Xn+1=(Xn+a/Xn)/2
要求:两次求出的x的差的绝对值小于1e-5
*/
# include <stdio.h>
# include <math.h>

int main()
{
    double a;
    double x0,x1=1;
    
    printf("输入a的值:");
    scanf("%lf",&a);
    
    do
    {
        x0 = x1;
        x1=(x0+a/x0)/2;
    }
    while(fabs(x1-x0)>=1e-5);
    printf("%lf的平方根是%lf\n",a,x1);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a的值:2
2.000000的平方根是1.414214
Press any key to continue
————————————
*/

 

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

/*
时间:2011年10月26日8:55:22
题目:用牛顿迭代法求下面方程在1.5附近的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>

int main()
{
    double x0,x1=1.5;
    double fx,fd;

    do
    {
    x0=x1;
    fx=((2*x0-4)*x0+3)*x0-6;
    fd=(6*x0-8)*x0+3;
    x1=x0-fx/fd;
    }
    while(fabs(x1-x0)>=1e-5);

    printf("方程在1.5附近的根是%lf\n",x1);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
方程在1.5附近的根是2.000000
Press any key to continue
————————————
*/

 

5.15 用二分法求下面方程在(-10,10)之间的根 2X^3-4X^2+3X-6=0

/*
时间:2011年10月26日9:43:48
题目:习题5.15 用二分法求下面方程在(-10,,10)之间的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>

int main()
{
    double x0=-10,x1=10,x2;
    double fx0,fx1,fx2;
    
    fx0=((2*x0-4)*x0+3)*x0-6;
    fx1=((2*x1-4)*x1+3)*x1-6;
    
    if(fx0*fx1<0)
    {
        do
        {    
            x2=(x0+x1)/2;
            fx2=((2*x2-4)*x2+3)*x2-6;
            if(fx2*fx1<0)
            {
                x0=x2;
            }
            else
            {
                x1=x2;
            }
            fx0=((2*x0-4)*x0+3)*x0-6;
            fx1=((2*x1-4)*x1+3)*x1-6;
        }
        while(fabs(fx2)>=1e-5);
        printf("该范围内的根是%lf\n",x2);
    }
    else if(fx0*fx1==0)
    {
        if(fx0==0)
        {
            printf("该范围有根%lf\n",x0);
        }
        if(fx1==0)
        {
            printf("该范围有根%lf\n",x1);
        }
    }
    else
    {
        printf("该范围内没有根\n");
    }
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
该范围内的根是2.000000
Press any key to continue
————————————
*/

 

5.16 输出菱形图案

/*
时间:2011年10月26日10:56:44
题目:输出菱形图案
*/
# include <stdio.h>

void draw (int i);

int max=7,n=2;
int main()
{
    int i;
    
    for(i=1;i<max;i+=n)
    {
        draw(i);
    }
    for(i=max;i>0;i-=n)
    {
        draw(i);
    }
    return 0;
}

void draw (int i)
{
    int j,k;
    for(j=1;j<=(max-i)/2;++j)
    {
        printf(" ");
    }
    for(k=1;k<=i;++k)
    {
        printf("*");
    }
    printf("\n");
}
/*
在VC++6.0中的输出结果为:
————————————
   *
  ***
 *****
*******
 *****
  ***
   *
Press any key to continue
————————————
*/

 

5.17 两个乒乓球队进行比赛,各出3人,甲队为ABC 3人.乙队为XYZ 3人;已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和XZ比,请编程序找出 3对赛手的名单。

/*
时间:2011年10月26日11:24:58
题目:习题5.17 两个乒乓球队进行比赛,各出3人,甲队为A,B,C 3人.乙队为X.Y,Z 3人;已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X.Z比,请编程序找出 3对赛手的名单。
*/
# include <stdio.h>

int main()
{
    
    char a,b,c;
    for(a='y';a<='z';++a)        //a不与x比
    {
        for(b='x';b<='z';++b)
        {
            c='y';            //c不与x和z比,则只能跟y比
            if(a!=b && b!=c && c!=a)    //a,b,c不会与相同的对手比赛
            {
                printf("a VS %c\n",a);
                printf("b VS %c\n",b);
                printf("c VS %c\n",c);
            }
        }
    }
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
a VS z
b VS x
c VS y
Press any key to continue
————————————
*/
默认分类 | 阅读 1449 次
文章评论,共1条
于祥
2012-03-23 12:43
1
不错哦
游客请输入验证码
浏览11292次
文章分类
文章归档
最新评论