哈工大C语言程序设计精髓第八周

由于这些代码也是我初学时写的代码,故其中的规范程度及简洁程度并不很好(此处我后来写的有可以参考一下->C语言代码规范),但是能很好的接近出初学者的水平,也更有参考价值!排版不易,喜欢就点个赞吧!如有问题,请勿吐槽,欢迎留言互相学习。

第8周编程题在线测试

  1. 摘苹果
    题目内容

    陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当他不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度(已知在100cm到200cm之间,包括100cm和200cm),以及陶陶把手伸直时能达到的最大高度(已知在100cm到120cm之间,包括100cm和120cm),请你编写程序帮助陶陶计算一下他能摘到的苹果数目。假设他碰到苹果,苹果就会掉下来。
    函数原型:int GetApple(int a[], int height, int n);
    函数功能:计算淘淘能摘到的苹果数目
    函数参数:数组a保存苹果到地面的高度;height代表陶陶把手伸直时能达到的最大高度;n为苹果数
    函数返回值:淘淘能摘到的苹果数目
    程序运行示例1:
    100 200 150 140 129 134 167 198 200 111↙
    110↙
    5
    程序运行示例2:
    120 110 200 134 122 162 183 144 128 100↙
    105↙
    6
    输入格式: “%d”
    注意(第一行输入的数据是10个苹果分别到地面的高度;第二行输入的数据是陶陶把手伸直时能达到的最大高度)
    输出格式:"%d"

代码实现

#include <stdio.h>
#include <stdlib.h>
int GetApple(int a[], int height, int n);
int main()
{
    int a[100],b,c,n;
    for(c=0;c<10;c++)
    {
        scanf("%d",&a[c]);
    }
    scanf("%d",&b);
    printf("%d",GetApple(a,b,n));
    return 0;
}
int GetApple(int a[], int height, int n)
{
    int c;
    for(c=0,n=0;c<10;c++)
    {
        if(a[c]<=30+height)
        {
            n=n+1;
        }
    }
    return n;
}
  1. 好数对
    题目内容

    已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。
    :集合中最多有1000个元素,元素最大不超过10000
    程序运行示例1:
    4↙
    1 2 3 4↙
    2
    程序运行示例2:
    7↙
    2456 3251 654 890 100 754 1234↙
    1
    输入格式:"%d"
    第一行:输入集合A的元素个数
    第二行:输入A的各个元素,用空格隔开
    输出格式:"%d"

代码实现

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b[1000],c,d,e,s,sum=0,n=0;
    scanf("%d",&a);
    for(c=0;c<a;c++)
    {
        scanf("%d",&b[c]);
    }
    for(d=0;d<a-1;d++)
    {
        for(e=d+1;e<a;e++)
        {
            sum=b[d]+b[e];
            for(s=0;s<a;s++)
            {
                if(sum==b[s])
                {
                    n+=1;
                }
            }
        }
    }
    printf("%d",n);
    return 0;
}
  1. 组合三位数(4分)
    题目内容

    将0到9这十个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的1/2,是第三个3位数的1/3。问应当怎样分,编写程序实现。
    输入格式: 无
    输出格式:"%d,%d,%d\n" (注意:输出的顺序为第一个3位数,第二个3位数,第三个3位数)
    注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!

代码实现

#include<stdio.h>
int main()
{
    int a1,a2,a3,b1,b2,b3,c1,c2,c3,a,b,c;
    for( a=100;a<333;a++)
    {
        b=a*2;
        c=a*3;
        a1=a/100;
        a2=(a-100*a1)/10;
        a3=a%10;
        b1=b/100;
        b2=(b-100*b1)/10;
        b3=b%10;
        c1=c/100;
        c2=(c-100*c1)/10;
        c3=c%10;
        if(a1-a2&&a1-a3&&a1-b1&&a1-b2&&a1-b3&&a1-c1&&a1-c2&&a1-c3
           &&a2-a3&&a2-b1&&a2-b2&&a2-b3&&a2-c1&&a2-c2&&a2-c3
           &&a3-b1&&a3-b2&&a3-b3&&a3-c1&&a3-c2&&a3-c3
           &&b1-b2&&b1-b3&&b1-c1&&b1-c2&&b1-c3
           &&b2-b3&&b2-c1&&b2-c2&&b2-c3
           &&b3-c1&&b3-c2&&b3-c3
           &&c1-c2&&c1-c3)
            printf("%d,%d,%d\n",a,b,c);
    }
}
  1. 求100以内的最大素数
    题目内容

    编程计算n(n<=500)以内的10个最大素数及其和,分别输出这最大的10个素数及其和。n的值要求从键盘输入。要求10个素数按从大到小的顺序输出。
    程序运行示例1:
    Input n(n<=500):10↙
    7 5 3 2
    sum=17
    程序运行示例2:
    Input n(n<=500):100↙
    97 89 83 79 73 71 67 61 59 53
    sum=732
    输入提示信息:“Input n(n<=500):”
    输入格式: “%d”
    10个最大素数的输出格式:"%6d"
    10个最大素数和的输出格式:"\nsum=%d\n"
    注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!

代码实现

#include <stdio.h>
int isprim(int x)
{
    int n=1,i=2;
    while(n!=0 )
    {
        n=x%i;
        i++;
        if(i>=x)
        {
        return 1;
         break;
        }
    }
    if(i<=x)
    return 0;
}
int main( )
{
    int n,sum=0,count=0;
    printf("Input n(n<=500):");
    scanf("%d",&n);
    for(n;n>0;n--)
    {
        if(isprim(n)&&n!=1)
        {
            printf("%6d",n);
            sum+=n;
            count++;
        }
        if(count>9)
            break;
    }
    printf("\nsum=%d\n",sum);
   return 0;
}

练兵区——编程题

  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”
    输入样例1:
    2014-12-22
    输出样例1:
    He is working
    输入样例2:
    2014-12-24
    输出样例2:
    He is having a rest
    输入样例3:
    2014-12-32
    输出样例3:
    Invalid input

代码实现

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n,y,r,a,d=0,ds=0,dds=0,q;
    a=scanf("%4d-%2d-%2d",&n,&y,&r);
    if(a!=3 || n<1990 || y<1 || y>12 || r>31 || r<1)
    {
        printf("Invalid input");
        goto END;
    }
    else
    {
        switch (y)
        {
        case 1:
            dds=0;
            break;
        case 2:
            dds=31;
            break;
        case 3:
            dds=59;
            break;
        case 4:
            dds=90;
            break;
        case 5:
            dds=120;
            break;
        case 6:
            dds=151;
            break;
        case 7:
            dds=181;
            break;
        case 8:
            dds=212;
            break;
        case 9:
            dds=243;
            break;
        case 10:
            dds=273;
            break;
        case 11:
            dds=304;
            break;
        case 12:
            dds=334;
            break;
        }
        if(((n%4==0 &&  n%100!=0) || (n%100==0 && n%400==0))&&(y>2))
            dds+=1;
        for(q=1990;q<n;q++)
        {
            if((q%4==0 &&  q%100!=0) || (q%100==0 && q%400==0))
                d+=1;
        }
        ds=365*(n-1990)+d+dds+r;
    }
    if(ds%5==1 || ds%5==2 || ds%5==3)
        printf("He is working");
    else
        printf("He is having a rest");
        END: ;
    return 0;
}
  1. 统计用户输入
    题目内容

    从键盘读取用户输入直到遇到#字符,编写程序统计读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。(要求用getchar()输入字符)
    程序运行结果示例1:
    Please input a string end by #:
    abc def↙
    jklm op↙
    zkm #↙
    space: 3,newline: 2,others: 15
    程序运行结果示例2:
    Please input a string end by #:
    hello friend!#↙
    space: 1,newline: 0,others: 12
    输入提示信息:“Please input a string end by #:\n”
    输入格式: getchar()
    输出格式: “space: %d,newline: %d,others: %d\n”

代码实现

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a=0,b=0,c=0;
    char s;
    printf("Please input a string end by #:\n");
    while((s=getchar())!='#')
    {
        if(s==' ')
            a++;
        else if(s=='\n')
            b++;
        else
            c++;
    }
    printf( "space: %d,newline: %d,others: %d\n",a,b,c);
    return 0;
}
  1. 统计正整数中指定数字的个数
    题目内容

    从键盘输入一个正整数number,求其中含有指定数字digit的个数。例如:从键盘输入正整数number=1222,若digit=2,则1223中含有 3个2,要求用函数实现。函数原型为:int CountDigit(int number,int digit);
    程序运行结果示例1:
    Input m,n:
    1222,2↙
    3
    程序运行结果示例2:
    Input m,n:
    1234,6↙
    0
    输入提示信息:“Input m,n:\n”
    输入格式: “%d,%d”
    输出格式: “%d\n”
    注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!

代码实现

#include <stdio.h>
#include <stdlib.h>
int CountDigit(int number,int digit);
int main()
{
    int m,n;
    printf("Input m,n:\n");
    scanf( "%d,%d",&m,&n);
    printf("%d\n",CountDigit(m,n));
    return 0;
}
int CountDigit(int number,int digit)
{
    int s=0;
    for(;number>0;number/=10)
    {
        if(number%10==digit)
            s++;
    }
    return s;
}
  1. 玫瑰花数
    题目内容

    如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。
    输入格式:无
    输出格式:"%d\n"
    注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int a,b,c,d,n;
    for(n=1000;n<10000;n++)
    {
        a=n%10;
        b=n/10%10;
        c=n/100%10;
        d=n/1000%10;
        if(pow(a,4)+pow(b,4)+pow(c,4)+pow(d,4)==n)
        {
            printf("%d\n",n);
        }
    }
    return 0;
}
  1. 四位反序数
    题目内容

    反序数就是将整数的数字倒过来形成的整数。例如,1234的反序数是4321。设N是一个四位数,它的9倍恰好是其反序数,编程计算并输出N的值。
    输入格式: 无
    输出格式:"%d\n"

代码实现

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n,a,b,c,d,s;
     for(n=1000;n<10000;n++)
    {
        a=n%10;
        b=n/10%10;
        c=n/100%10;
        d=n/1000%10;
        s=a*1000+b*100+c*10+d;
        if(s==n*9)
        {
            printf("%d\n",n);
        }
    }
    return 0;
}
  1. 8除不尽的自然数
    题目内容

    一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求满足以上条件的最小自然数。
    输入格式: 无
    输出格式:"%d\n"
    注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!

代码实现

#include<stdio.h>
int  main()
{
    int i,a1,a2,a3,b1,b2;
    for(i=0;;i++)
    {
        a1=i/8;
        a2=a1/8;

        if(i%8==1 && a2%8==7 && a1%8==1)
            a3=a2/8;
        b1=i/17;
        b2=b1/17;
        if(i%17==4 && b1%17==15 && b2==a3*2)
        {
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}
  1. 矩阵转置v1.0
    题目内容

    用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。
    程序运行结果示例1:
    Input n:3↙
    Input 33 matrix:
    1 2 3↙
    4 5 6↙
    7 8 9↙
    The transposed matrix is:
    1 4 7
    2 5 8
    3 6 9
    程序运行结果示例2:
    Input n:2↙
    Input 2
    2 matrix:
    1 2↙
    4 5↙
    The transposed matrix is:
    1 4
    2 5
    输入提示信息
    提示输入矩阵的阶数:“Input n:”
    提示输入矩阵数据:“Input %d*%d matrix:\n”
    输入格式: “%d”
    输出提示信息:“The transposed matrix is:\n”
    输出格式:"%4d"

代码实现

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b[100][100],c,d,e,f;
    printf("Input n:");
    scanf("%d",&a);
    printf("Input %d*%d matrix:\n",a,a);
    for(c=0;c<a;c++)
        for(d=0;d<a;d++)
            {scanf("%d",&b[c][d]);}
    printf("The transposed matrix is:\n");
    for(e=0;e<a;e++)
        {for(f=0;f<a;f++)
            {printf("%4d",b[f][e]);}
        printf("\n");}
    return 0;
}
  1. 兔子生崽问题
    题目内容

    假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n<=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题,n的值要求从键盘输入。
    参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:
    (1)每月小兔对数 = 上个月成兔对数。
    (2)每月成兔对数 = 上个月成兔对数 + 上个月小兔对数。
    综合(1)和(2)有:每月成兔对数 = 前两个月成兔对数之和。
    用fn(n=1,2,…)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:
    程序运行示例:
    Input n(n<=12):
    10↙
    1 2 3 5 8 13 21 34 55 89
    Total=89
    输入提示:“Input n(n<=12):\n”
    输入格式:"%d"
    输出格式
    每个月兔子对数的输出格式: “%4d”
    第12个月的兔子总数的输出格式: “\nTotal=%d\n”

代码实现

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n=0,a=1,b=1,c=0,i=0;
    printf("Input n(n<=12):\n");
    scanf("%d",&n);
    printf("%4d",1);
    for (i = 0; i < n - 1;i++)
    {
        c = a + b;
        a = b;
        b = c;
        printf("%4d", c);
    }
    printf( "\nTotal=%d\n",c);
    return 0;
}
  1. 抓交通肇事犯
    题目内容

    一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
    [提示]:假设这个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 <stdlib.h>
int main()
{
    int b,c,d,e;
        for(b=0;b<=9;b++)
        {
            for(c=0;c<=9;c++)
            {
                d=1000*b + 100*b + 10*c + c;
                for(e=31;e<100;e++)
                {
                    if(e*e==d&&b!=c)
                    {
                        printf("k=%d,m=%d\n",d,e);
                    }
                }
            }
        }
    return 0;
}
  1. 检验并打印幻方矩阵
    题目内容

    幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个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>
int  main()
{
    int a[4][5],b[12],c,d,e,f,y,u;
     for(c=0;c<=4;c++)
     {
         for(d=0;d<=4;d++)
         {
             scanf("%d",&a[c][d]);
         }
     }
     b[0]=a[0][0]+a[0][1]+a[0][2]+a[0][3]+a[0][4];
     b[1]=a[1][0]+a[1][1]+a[1][2]+a[1][3]+a[1][4];
     b[2]=a[2][0]+a[2][1]+a[2][2]+a[2][3]+a[2][4];
     b[3]=a[3][0]+a[3][1]+a[3][2]+a[3][3]+a[3][4];
     b[4]=a[4][0]+a[4][1]+a[4][2]+a[4][3]+a[4][4];
     b[5]=a[0][0]+a[1][0]+a[2][0]+a[3][0]+a[4][0];
     b[6]=a[0][1]+a[1][1]+a[2][1]+a[3][1]+a[4][1];
     b[7]=a[0][2]+a[1][2]+a[2][2]+a[3][2]+a[4][2];
     b[8]=a[0][3]+a[1][3]+a[2][3]+a[3][3]+a[4][3];
     b[9]=a[0][4]+a[1][4]+a[2][4]+a[3][4]+a[4][4];
     b[10]=a[0][0]+a[1][1]+a[2][2]+a[3][3]+a[4][4];
     b[11]=a[0][4]+a[1][3]+a[2][2]+a[3][1]+a[4][0];
     for(y=0;y<12;y++)
     {
        for(u=y+1;u<12;u++)
        {
            if(b[y]!=b[u])
            {printf("It is not a magic square!\n");
            goto END;}
        }
     }
    printf("It is a magic square!\n");
    for(e=0;e<=4;e++)
    {
        for(f=0;f<=4;f++)
        {
            printf("%4d",a[e][f]);
        }
        printf("\n");
    }
    END: ;
    return 0;
}

如有问题,欢迎留言~~ 排版不易,喜欢的请点赞分享啊!!

发布了18 篇原创文章 · 获赞 29 · 访问量 4770

猜你喜欢

转载自blog.csdn.net/weixin_45652695/article/details/104753418
今日推荐