《C程序设计快速进阶大学教程》第8章编程题

  1. 关于阶乘的数值问题,尝试用各种循环语句实现:
    (1)编写程序求n阶乘。输入一个正整数n,输出其阶乘 的值。
    (2)编写程序求阶乘和。对于一个正整数m,输出1~m的阶乘和 。
    (3)编写程序求常量e的近似值,估算公式如下:
    在这里插入图片描述
    (4)编写程序计算的 值,公式如下:
    在这里插入图片描述
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//输入一个正整数n,输出其阶乘的值。
int factorial(int n){
    int i;
    int fac = 1;
    for(i=1;i<=n;i++){
        fac *= i;
    }
    return fac;
}

//求阶乘和
int factorial_sum(int n){
    int i;
    int fac;
    int fac_sum = 0;
    for(i=1;i<=n;i++){
        fac = factorial(i);
        fac_sum += fac;
    }
    return fac_sum;
}

//求常量e的近似值
float ee(int n){
    int i;
    float e=1.0;
    int fac;
    for(i=1;i<=n;i++){
        fac = factorial(i);
        e = e + 1.0/fac;
        printf("%d \t %f \n",fac,e);
    }
    return e;
}

//计算的e^x值
float eex(double x,int n){
    int i;
    float ex = 1.0;
    int fac;
    for(i=1;i<=n;i++){
        fac = factorial(i);
        ex = ex + pow(x,i)/fac;
    }
    return ex;
}

int main()
{
    printf("请输入选择的操作:\n");
    printf("(1)求n阶乘。\n (2)求阶乘和\n(3)求常量e的近似值\n(4)计算的e^x值\n");
    int secletion;
    scanf("%d",&secletion);

    switch(secletion){
        case 1:
            {
                printf("求n阶乘\n");
                int n;
                scanf("%d",&n);
                int fac;
                fac = factorial(n);
                printf("%d\n",fac);
                break;
            }
        case 2:
            {
                printf("求阶乘和\n");
                int n;
                scanf("%d",&n);
                int fac_sum;
                fac_sum = factorial_sum(n);
                printf("%d\n",fac_sum);
                break;
            }
        case 3:
            {
                printf("求常量e的近似值\n");
                int n;
                scanf("%d",&n);
                float e;
                e = ee(n);
                printf("%.6f\n",e);
                break;
            }
        case 4:
            {
                printf("计算的e^x值\n");
                double x;
                int n;
                scanf("%lf%d",&x,&n);
                float ex;
                ex = eex(x,n);
                printf("%.6f\n",ex);
                break;
            }
        default:
            printf("输入错误");
            break;
    }
    return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

//方法1
float pi_1(){
    float pi_4 = 0;
    int i=1;
    float flag = 1;
    int zf = 1;//判断正负
    while(flag > 1e-6){
        flag = 1.0/(2*i-1);
        pi_4 += zf*(flag);
        zf = -zf;
        //printf("%.6f\t",flag);
        i++;
    }
    return 4*pi_4;
}
//方法2
double pi_2(){
    double pi_2 = 1.0;
    int i=1;
    double flag = 1.1;
    while(flag-1 > 1e-10){
        flag = (double) (2*i*2*i)/(double)((2*i-1)*(2*i+1));
        printf("%.6lf\t",flag);
        pi_2 *= flag;
        i++;
    }
    return 2*pi_2;
}
int main()
{
    printf("请输入计算pi的方法:\n");
    int sel;
    scanf("%d",&sel);

    switch(sel){
    case 1:
        {
            printf("方法1求得的pi值为:%.6f\n",pi_1());
            break;
        }
    case 2:
        {
            printf("方法2求得的pi值为:%.6lf\n",pi_2());
            break;
        }
    default:
        printf("输入错误\n");
        break;
    }
    return 0;
}

  1. 分别用穷举法和迭代法求两个整数的最大公约数。输入两个正整数m和n,编程求它们的最大公约数。
    最简单的求最大公约数算法为遍历法,即在小于两数最小值的所有整数中寻找公约数,能将两数整除的最大因子为最大公约数。为了加快搜寻速度,常采用辗转相除法求最大公约数: m 与 n 的最大公约数等于 n 与 m%n 的最大公约数;用n和m%n替换原来的 m与n的值;直到n = 0时,当前 m的值为所求最大公约数。
    例如,m = 24,n = 9时:
    (1)24和 9 的最大公约数等于 ( 24 % 9 ) = 6 和 9 的最大公约数;
    (2)9 和 6 的最大公约数等于 ( 9 % 6 ) = 3 和 6 的最大公约数;
    (3)6 和 3 的最大公约数等于 ( 6 % 3 ) = 0 和 3 的最大公约数;
    因此 24 和 9 的最大公约数等于 3。
#include <stdio.h>
#include <stdlib.h>
//穷举法Maximum common divisor
int mcd_1(int m,int n){
    int i;
    for(i=m;i>=1;i--){
        if(m%i == 0 && n%i==0){
            break;
        }
    }
    return i;
 }
//迭代法
int mcd_2(int m,int n){
    int t;
    while(m!=0){
        t = n%m;
        n = m;
        m = t;
    }
    return n;
}

int main()
{
    printf("请输入两个数:\n");
    int m,n;
    scanf("%d %d",&m,&n);
    if(m>n){
        int t = n;
        n = m;
        m = t;
    }else if(m == n){
        printf("%d\n",m);
        return 0;
    }
    printf("请输入选择的操作:1,穷举法;2,迭代法\n");
    int sel;
    scanf("%d",&sel);
    switch(sel){
    case 1:
        {
            printf("%d\n",mcd_1(m,n));
            break;
        }
    case 2:
        {
            printf("%d\n",mcd_2(m,n));
            break;
        }
    default :
        {
            printf("输入错误");
            break;
        }
    }

    return 0;
}

  1. 菲波那契在数学代表作《算盘书》提出了这样的问题:有小兔一对,若在它们出生后第二个月成年,第三个月就有生殖能力,而有生殖能力的一对兔子每一个月都生一对兔子。设所生的一对兔均为一雌一雄,且均无死亡。问新生的一对兔子一年后可以繁殖成多少对兔子?该问题可以用菲波那契数列解决。
    Fibonacci 数列:0,1,1,2,3,5,8,13,21,34,……
    f0 = 0
    f1 = 1
    fn = fn-1 + fn-2 ( n >= 2 )
    用迭代的方法输出数列的前20项,每行输出8个数。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("输入n(n>=2):\n");
    int n;
    scanf("%d",&n);
    int f0 = 0;
    int f1 = 1;
    int fi =0;
    int i=1;
    while(i < n){
        if(i==1){
            printf("%d\t",f0);
        }else if(i==2){
            printf("%d\t",f1);
        }else{
            fi = f0 + f1;
            f0 = f1;
            f1 = fi;
            printf("%d\t",fi);
        }
        if(i%8 == 0){
            printf("\n");
        }
        i++;
    }

    return 0;
}

5.屏幕打印图中的三角形图案.
在这里插入图片描述
图8.13 输出三角形

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("选择输出的三角形类型:a,b,c,d\n");
    char ch;
    ch = getchar();
    switch(ch){
    case 'a':
        {
            int i;
            int j;
            for(i=1;i<=10;i++){
                for(j=1;j<=i;j++){
                    printf("*");
                }
                printf("\n");
            }
            break;
        }
    case 'b':
        {
            int i;
            int j;
            for(i=10;i>=1;i--){
                for(j=1;j<=i;j++){
                    printf("*");
                }
                printf("\n");
            }
            break;
        }
    case 'c':
        {
            int i,j,k;
            for(i=10;i>=1;i--){
                for(k=0;k<10-i;k++){
                    printf(" ");
                }
                for(j=i;j>=1;j--){
                    printf("*");
                }
                printf("\n");
            }
            break;
        }
    case 'd':
        {
            int i,j,k;
            for(i=1;i<=10;i++){
                for(k=0;k>10-i;k++){
                    printf(" ");
                }
                for(j=1;j<=i;j++){
                    printf("*");
                }
                printf("\n");
            }
            break;
        }
    default :
        {
            printf("输入错误");
            break;
        }
    }
    return 0;
}

6.编程判断一个数是否为素数,输出n~m内的所有素数,并统计素数的个数。

#include <stdio.h>
#include <stdlib.h>

//判断一个数是不是素数
int sushu(int n){
    int i;
    int flag = 1;
    for(i=2;i<n;i++){
        if(n%i == 0){
            flag =0;
            break;
        }
    }
    return flag;
}
//2,输出n~m内的所有素数
void sushu_2(int n,int m){
    int i;
    for(i=n;i<=m;i++){
        int flag;
        flag = sushu(i);
        if(flag == 1){
            printf("%d\t",i);
        }
    }
}
int main()
{
    printf("请选择操作:1,一个数是否为素数 2,输出n~m内的所有素数\n");
    int sel;
    scanf("%d",&sel);
    switch(sel){
    case 1:
        {
            int n;
            scanf("%d",&n);
            int flag;
            flag = sushu(n);
            if(flag == 1){
                printf("素数\n");
            }else if(flag == 0){
                printf("不是素数\n");
            }
            break;
        }
    case 2:
        {
            int n,m;
            scanf("%d %d",&n,&m);
            sushu_2(n,m);
            break;
        }
    default :
        {
            printf("输入错误");
            break;
        }
    }
    return 0;
}

  1. 输入一个正整数,如果该数不是素数,则将其分解质因数,输出所有的因子。
    例如:输入90,打印出90 = 2 * 3 * 3 * 5。
#include <stdio.h>
#include <stdlib.h>
//判断一个数是不是素数
int sushu(int n){
    int i;
    int flag = 1;
    for(i=2;i<n;i++){
        if(n%i == 0){
            flag =0;
            break;
        }
    }
    return flag;
}
//分解质因数
void zys(int n){
    int i;
    printf("%d=",n);
    for(i=2;i<=n;i++){
       while(n%i == 0){
            if(n != i){
                n = n/i;
                printf("%d*",i);
            }else{
                n = n/i;
                printf("%d",i);
                break;
            }
        }
    }
}
int main()
{
    printf("请输入一个数:\n");
    int n;
    scanf("%d",&n);
    int flag = sushu(n);
    if(flag == 0){
        zys(n);
    }else if(flag == 1){
        printf("素数\n");
    }
    return 0;
}

  1. 输入5位以内的任何数字,分离每一位的数值,并输出各位的和。
    如入输入2345, 输出2+3+4+5=14。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("请输入5位以内的数字:\n");
    int n;
    scanf("%d",&n);
    int a[5]={0,0,0,0,0};
    int count=0;
    while(n != 0){
        a[count] = n%10;
        n = n/10;
        count++;//最后的时候,多加了一个1
    }
    int i;
    int sum=0;
    for(i=count-1;i>0;i--){
        printf("%d+",a[i]);
        sum += a[i];
    }
    printf("%d",a[0]);
    sum += a[0];
    printf("=%d",sum);
    return 0;
}

9[选作].编程实现猜数游戏
由程序自动生成一个1到10之间随机整数,请参加游戏的人猜,游戏者通过键盘输入猜测的数字,如果猜对了则结束游戏;否则输出提示信息,显示所猜的数是太大还是太小。 游戏结束后输出猜字的次数。 若规定输入猜测字的次数不得超过6次,若多于6次仍未猜中则自动结束游戏,并输出“输局”的信息。如果在游戏过程中,玩家可以随时终止游戏,在提示玩家继续输入新的猜测数时,可由用户选择是否继续进行游戏。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int rn;
    int guess;

    rn = rand()%10+1;

    int count;
    int flag=0;
    for(count=1;count<=6;count++){
        printf("请猜一个1到10之间的数:(输入-1结束游戏)\n");
        scanf("%d",&guess);
        if(guess == rn){
            printf("成功\n");
            flag = 1;
            break;
        }else if(guess < rn && guess>=1){
            printf("太小\n");
        }else if(guess > rn){
            printf("太大\n");
        }else if(guess == -1){
            printf("结束游戏\n");
            break;
        }
    }

    if(count > 6 && flag == 0){
        printf("*******************输局*********************\n");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/lanzijingshizi/article/details/83622463
今日推荐