1. 程式人生 > >《C程式設計快速進階大學教程》第8章程式設計題

《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;
}