2020年MOOCC語言程序設計精髓第八週編程題練兵

1三天打漁兩天曬網
題目內容:
中國有句俗語叫“三天打魚兩天曬網”,某人從1990年1月1日起開始“三天打魚兩天曬網”,即工作三天,然後再休息兩天。問這個人在以後的某一天中是在工作還是在休息。從鍵盤任意輸入一天,編程判斷他是在工作還是在休息,如果是在工作,則輸出:He is working,如果是在休息,則輸出:He is having a rest,如果輸入的年份小於1990或者輸入的月份和日期不合法,則輸出:Invalid input。
輸入格式: “%4d-%2d-%2d”
輸出格式:
“Invalid input” 或"He is having a rest" 或"He is working"

#include <stdio.h>


int main()
{
    int i,j,k,number=0;
    int year,month,day=0;
    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%4d-%2d-%2d",&year,&month,&day);
    if(year%400==0||(year%100!=0&&year%4==0))
        days[1]=29;
    if(month<1||month>12||day<1||day>days[month-1]||year<1990){
        printf("Invalid input");
        return 0;
    }
    for(i=1990;i<year;i++){
        if(i%400==0||(i%100!=0&&i%4==0))
            number += 366;
        else
            number += 365;
    }
    for(i=1;i<month;i++){
        number += days[i-1];
    }
    for(i=1;i<=day;i++){
        number += 1;
    }
    if(number%5<=3&&number%5>=1)
        printf("He is working");
    else
        printf("He is having a rest");
    return 0;
}

2統計用戶輸入
題目內容:
從鍵盤讀取用戶輸入直到遇到#字符,編寫程序統計讀取的空格數目、讀取的換行符數目以及讀取的所有其他字符數目。(要求用getchar()輸入字符)
輸入提示信息:“Please input a string end by #:\n”
輸入格式: getchar()
輸出格式: “space: %d,newline: %d,others: %d\n”

#include <stdio.h>

int main()
{
    char c;
    int space=0,newline=0,others=0;
    printf("Please input a string end by #:\n");
    c = getchar();
    while(c!='#'){
        c = getchar();
        if(c == ' '){
            space++;
        }else if(c =='\n'){
            newline++;
        }else{
            others++;
        }
    }
    printf("space: %d,newline: %d,others: %d\n",space,newline,others);
    return 0;
}

3統計正整數中指定數字的個數
題目內容:
從鍵盤輸入一個正整數number,求其中含有指定數字digit的個數。例如:從鍵盤輸入正整數number=1222,若digit=2,則1223中含有 3個2,要求用函數實現。函數原型爲:int CountDigit(int number,int digit);

#include <stdio.h>

int CountDigit(int number, int digit){
    int l,num=0;
    while(number!=0){
        l = number%10;
        if(l==digit)
            num++;
        number/=10;
    }
    return num;
}

int main()
{
    int m,n;
    printf("Input m,n:\n");
    scanf("%d,%d",&m,&n);
    printf("%d\n",CountDigit(m,n));
    return 0;
}

4玫瑰花數
題目內容:
如果一個n位正整數等於它的n個數字的n次方和,則稱該數爲n位自方冪數。四位自方冪數稱爲玫瑰花數。編程計算並輸出所有的玫瑰花數。

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    for(i=1000;i<=9999;i++){
        int num1=i%10;
        int num2=i/10%10;
        int num3=i/100%10;
        int num4=i/1000;
        if(i==pow(num1,4)+pow(num2,4)+pow(num3,4)+pow(num4,4))
            printf("%d\n",i);
    }
    return 0;
}

5四位反序數
題目內容:
反序數就是將整數的數字倒過來形成的整數。例如,1234的反序數是4321。設N是一個四位數,它的9倍恰好是其反序數,編程計算並輸出N的值。

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    for(i=1000;i<=9999;i++){
        int num1=i%10;
        int num2=i/10%10;
        int num3=i/100%10;
        int num4=i/1000;
        if(num1*1000+num2*100+num3*10+num4==i*9)
            printf("%d\n",i);
    }
    return 0;
}

68除不盡的自然數
題目內容:
一個自然數被8除餘1,所得的商被8除也餘1,再將第二次的商被8除後餘7,最後得到一個商爲a。又知這個自然數被17除餘4,所得的商被17除餘15,最後得到一個商是a的2倍。求滿足以上條件的最小自然數。

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    for(i=9;;i++){
        int a = i/8/8/8;
        if(i%8==1&&i/8%8==1&&i/8/8%8==7){
            if(i%17==4&&i/17%17==15&&i/17/17==a*2){
                printf("%d\n",i);
                return 0;
            }
        }
    }
    return 0;
}

7矩陣轉置v1.0
題目內容:
用二維數組作爲函數參數,編程計算並輸出n×n階矩陣的轉置矩陣。其中,n的值不超過10,n的值由用戶從鍵盤輸入。
輸入提示信息:
提示輸入矩陣的階數:“Input n:”
提示輸入矩陣數據:“Input %d*%d matrix:\n”
輸入格式: “%d”
輸出提示信息:“The transposed matrix is:\n”
輸出格式:"%4d"

#include <stdio.h>
#include <math.h>
#define MAX 10

void Swap(int matrix[][MAX], int n){
    int temp,i,j;
    for(i=0;i<n;i++){
        for(j=0;j<i;j++){
            temp=matrix[i][j];
            matrix[i][j]=matrix[j][i];
            matrix[j][i]=temp;
        }
    }
}

int main()
{
    int i,j,n;
    printf("Input n:");
    scanf("%d",&n);
    int matrix[MAX][MAX];
    printf("Input %d*%d matrix:\n",n,n);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&matrix[i][j]);
        }
    }
    Swap(matrix,n);
    printf("The transposed matrix is:\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%4d",matrix[i][j]);
        }
        if(i!=n-1)
            printf("\n");
    }
    return 0;
}

8兔子生崽問題
題目內容:
假設一對小兔的成熟期是一個月,即一個月可長成成兔,那麼如果每對成兔每個月都可以生一對小兔,一對新生的小兔從第二個月起就開始生兔子,試問從一對兔子開始繁殖,n(n<=12)月以後可有多少對兔子(即當年第n月份總計有多少對兔子,含成兔和小兔)?請編程求解該問題,n的值要求從鍵盤輸入。
參考答案:依題意,兔子的繁殖情況如圖所示。圖中實線表示成兔仍是成兔或者小兔長成成兔;虛線表示成兔生小兔。觀察分析此圖可發現如下規律:
(1)每月小兔對數 = 上個月成兔對數。
(2)每月成兔對數 = 上個月成兔對數 + 上個月小兔對數。
綜合(1)和(2)有:每月成兔對數 = 前兩個月成兔對數之和。
在這裏插入圖片描述
用fn(n=1,2,…)表示第n個月成兔對數,於是可將上述規律表示爲如下遞推公式:
在這裏插入圖片描述

#include <stdio.h>
#include <math.h>
#define MAX 10

int Rabbit_num(int n){
    if(n==0)
        return 0;
    if(n==1||n==2)
        return 1;
    else
        return Rabbit_num(n-1)+Rabbit_num(n-2);
}

int main()
{
    int i,n,sum=0;
    printf("Input n(n<=12):\n");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("%4d",Rabbit_num(i+1)+Rabbit_num(i));
    }
    printf("\nTotal=%d\n",Rabbit_num(i)+Rabbit_num(i-1));
    return 0;
}

9抓交通肇事犯
題目內容:
一輛卡車違犯交通規則,撞人後逃跑。現場有三人目擊事件,但都沒記住車號,只記下車號的一些特徵。甲說:牌照的前兩位數字是相同的;乙說:牌照的後兩位數字是相同的,但與前兩位不同;丙是位數學家,他說:四位的車號剛好是一個整數的平方。現在請根據以上線索幫助警方找出車號以便儘快破案。
[提示]:假設這個4位數的前兩位數字都是i,後兩位數字都是j,則這個可能的4位數
k = 1000i + 100i + 10j + j
式中,i和j都在0~9變化。此外,還應使k=m
m,m是整數。由於k是一個4位數,所以m值不可能小於31。
輸入格式: 無
輸出格式:“k=%d,m=%d\n”

#include <stdio.h>
#include <math.h>

int main()
{
    int i,j,k;
    for(i=1;i<10;i++){
        for(j=0;j<10;j++){
            if(i!=j){
                k=1000*i+100*i+10*j+j;
                if((int)sqrt(k)*(int)sqrt(k)==k)//判斷k開根號可以得到整數
                    printf("k=%d,m=%d\n",k,(int)sqrt(k));
            }
        }
    }
    return 0;
}

10檢驗並打印幻方矩陣
題目內容:
幻方矩陣是指該矩陣中每一行、每一列、每一對角線上的元素之和都是相等的。從鍵盤輸入一個5×5的矩陣並將其存入一個二維整型數組中,檢驗其是否爲幻方矩陣,並將其按指定格式顯示到屏幕上。
輸入格式: “%d”
輸出格式:
如果是幻方矩陣,輸出提示信息: “It is a magic square!\n”
矩陣元素的輸出: “%4d”(換行使用"\n")
如果不是幻方矩陣,輸出提示信息: “It is not a magic square!\n”
輸入樣例1:
17_24_1_8_15
23_5_7_14_16
4_6_13_20_22
10_12_19_21_3
11_18_25_2_9
(輸人樣例中“”代表空格)
輸出樣例1:
It is a magic square!
17241815
23571416
46132022
1012
19
21*3
1118
25***2**9
(輸出樣例中“
”代表空格)
輸入樣例2:
1_0_1_6_1
3_1_1_1_1
1_1_1_1_2
1_1_1_1_1
9_1_7_1_1
(輸人樣例中“
”代表空格)
輸出樣例2:
It is not a magic square!

#include <stdio.h>
#define MAX 5
#define SUM 12

int main()
{
    int i,j,k=0;
    int matrix[MAX][MAX];
    int sum[SUM]={0};
    for(i=0;i<MAX;i++){
        for(j=0;j<MAX;j++){
            scanf("%d",&matrix[i][j]);
            sum[k]+=matrix[i][j];//計算行之和
        }
        k++;
    }
    for(i=0;i<MAX;i++){
        for(j=0;j<MAX;j++){
            sum[k]+=matrix[j][i];//列之和
        }
        k++;
        sum[10]+=matrix[i][i];//主對角線
        sum[11]+=matrix[i][MAX-i-1];//逆對角線
    }
    for(i=0;i<SUM;i++){
        if(sum[i]!=sum[0]){
            printf("It is not a magic square!\n");
            return 0;
        }
    }
    printf("It is a magic square!\n");
    for(i=0;i<MAX;i++){
        for(j=0;j<MAX;j++){
            printf("%4d",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章