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;
}
发布了33 篇原创文章 · 获赞 11 · 访问量 8478

猜你喜欢

转载自blog.csdn.net/qq_40825479/article/details/105080164