2020年哈尔滨工业大学C语言程序设计精髓 第八周练兵编程题

/各位同学,对不起鸽了这么久,最近疫情原因学业繁忙,对于数组要理清思路使用,对于后面的指针学习有很大的帮助,用指针指向数组会让程序更加的简洁明了,但是一定不要乱用,对于任何技术或者算法的使用是基于理解的,别不会乱用,反而使得程序多为累赘,让别人难以理解。/
1
三天打渔两天晒网(4分)
题目内容:
中国有句俗语叫“三天打鱼两天晒网”,某人从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
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include<stdio.h>
int SingerYear(int d,int e)
{
    int j;
                 for(j=e; j>0; j--)
                    {
                        if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
                        {
                            d+=31;
                        }
                        else if(j==4||j==6||j==9||j==11)
                        {
                            d+=30;
                        }
                        else
                        {
                            d+=29;
                        }
                    }
                    return d;
}
int Sentence(int a,int b,int c)
{
    int i,j,sum=0;
    if(a<1990||b<=0||b>12||c>31)
    {
        return -1;
    }
    {
        for(i=a; i>=1990; i--)
        {
            if(a%400==0||(a%100!=0&&a%4==0))
            {
                if(i!=a)
                {
                    sum+=366;
                }
                else
                {
                  sum=SingerYear(sum,b);
                }
            }
            else
            {
                if(i!=a)
                {
                    sum+=365;
                }
                else
                {
                    for(j=b; j>0; j--)
                    {
                        if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
                        {
                            sum+=31;
                        }
                        else if(j==4||j==6||j==9||j==11)
                        {
                            sum+=30;
                        }
                        else
                        {
                            sum+=28;
                        }
                    }
                }
            }
        }
        if((sum+c)%5==0||(sum+c)%5==1||(sum+c)%5==2)
            return 2;
        else
            return 1;

    }

}
int main()
{
    int Year,Mouth,days,n;
    scanf("%4d-%2d-%2d",&Year,&Mouth,&days);
    n=Sentence(Year,Mouth,days);
    if(n==-1)
    {
        printf("Invalid input");
    }
    else if(n==1)
    {
        printf("He is having a rest");
    }
    else
    {
        printf("He is working");
    }

    return 0;
}

2
统计用户输入(4分)
题目内容:
从键盘读取用户输入直到遇到#字符,编写程序统计读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。(要求用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”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include<stdio.h>
void Sentence(char Fake[],int sum[])
{
    int i;
    for(i=0;Fake[i]!='#';i++)
    {
        if(Fake[i]==' ')
        {
            sum[0]++;
        }
        else if(Fake[i]=='\n')
        {
            sum[1]++;
        }
        else
        {
            sum[2]++;
        }
    }
}
int main()
{
    char Number[10000];
    int i,t,Sum[3]={0,0,0};
    printf("Please input a string end by #:\n");
    for(i=0;(Number[i]=getchar())!='#';i++);
    Sentence(Number,Sum);
    printf("space: %d,newline: %d,others: %d\n",Sum[0],Sum[1],Sum[2]);
    return 0;
}

3
统计正整数中指定数字的个数(4分)
题目内容:
从键盘输入一个正整数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”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include<stdio.h>
int CountDigit(int number,int digit)
{
    int i,j,count;
    for(i=0;number!=0;i++)
    {
        j=number%10;
        if(digit==j)
            count++;
        number=number/10;
    }
    return count;
}
int main()
{
    int m,n,IncludeNumber;
    printf("Input m,n:\n");
    scanf("%d,%d",&m,&n);
    IncludeNumber=CountDigit(m,n);
    printf("%d\n",IncludeNumber);
    return 0;
}

4
玫瑰花数(4分)
题目内容:
如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。

输入格式:无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include<stdio.h>
#include<math.h>
int main()
{
    int i,a,b,c,d;
    for(i=1000;i<=9999;i++)
    {
        a=i%10;
        b=(i/10)%10;
        c=(i/100)%10;
        d=i/1000;
        if(i==pow(a,4)+pow(b,4)+pow(c,4)+pow(d,4))
            printf("%d\n",i);
    }
    return 0;
}

5
四位反序数(4分)
题目内容:
反序数就是将整数的数字倒过来形成的整数。例如,1234的反序数是4321。设N是一个四位数,它的9倍恰好是其反序数,编程计算并输出N的值。

输入格式: 无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include<stdio.h>
#include<math.h>
int main()
{
    int i,a,b,c,d;
    for(i=1000;i<=9999;i++)
    {
        a=i%10;
        b=(i/10)%10;
        c=(i/100)%10;
        d=i/1000;
        if(i*9==a*1000+b*100+c*10+d)
            printf("%d\n",i);
    }
    return 0;
}

6
8除不尽的自然数(4分)
题目内容:
一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求满足以上条件的最小自然数。

输入格式: 无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include<stdio.h>
int main()
{
    int i,left,right;
    for(i=0;;i++)
    {
        left=((i*8+7)*8+1)*8+1;
        right=(34*i+15)*17+4;
        if(left==right)
        {
            printf("%d\n",(34*i+15)*17+4);
            break;
        }
    }
    return 0;
}

7
矩阵转置v1.0(4分)
题目内容:

用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。

程序运行结果示例1:
Input n:3↙
Input 3*3 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"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
int Elenment(int Matrix[10][10],int n)
{
    int i,j;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&Matrix[i][j]);
        }
        getchar();
    }
}
int change(int Matrix[10][10],int n)
{
    int i,j;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("%4d",Matrix[j][i]);
        }
        printf("\n");
    }
}
int main()
{
    int Matrix[10][10],n;
    printf("Input n:");
    scanf( "%d",&n);
    printf("Input %d*%d matrix:\n",n,n);
    Elenment(Matrix,n);
    printf("The transposed matrix is:\n");
    change(Matrix,n);
    return 0;
}

8
兔子生崽问题(4分)
题目内容:
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,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”

注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
int main()
{
  int i,RabbitFirst=1,RabbitSecond=1,RabbitThird,n;
  printf("Input n(n<=12):\n");
  scanf("%d",&n);
  printf("%4d",RabbitFirst);
  for(i=3;i<=n+1;i++)
  {
    RabbitThird=RabbitFirst+RabbitSecond;
    printf("%4d",RabbitThird);
    RabbitFirst=RabbitSecond;
    RabbitSecond=RabbitThird;
  }
  printf("\nTotal=%d\n",RabbitThird);
}

9
抓交通肇事犯(4分)
题目内容:
一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
[提示]:假设这个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”

注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
#include <math.h>
int main()
{
  int k=0,m=0,i,j;
  for(i=0;i<=9;i++)
  {
      for(j=0;j<=9;j++)
      {
          k=1000*i+100*i+10*j+j;
          m=sqrt(k);
          if(k==m*m&&k!=0)
          {
              printf("k=%d,m=%d\n",k,m);
          }
      }
  }
}

10
检验并打印幻方矩阵(4分)
题目内容:
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个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!
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输人样例中“_”代表空格,输出样例中“*”代表空格)
时间限制:500ms内存限制:32000kb

#include<stdio.h> 
#define MAX 5
int Fun(int a[MAX][MAX])
{
 int s1, s2, sum;
 int i, j;

 sum = 0;
 for (i = 0; i<MAX; i++)
  for (j = 0; j<MAX; j++)
   sum += a[i][j];

 sum /= MAX;

 for (i = 0; i<MAX; i++)
 {
  s1 = s2 = 0;
  for (j = 0; j<MAX; j++)//判断每一行每一列 
  {
   s1 += a[i][j];
   s2 += a[j][i];
  }
  if (s1 != sum || s2 != sum)
  {
   return 0;
  }
 }
 s1 = s2 = 0;
 for (i = 0; i<MAX; i++)//判断每一撇:主对角线 
 {
  s1 += a[i][i];
  s2 += a[i][MAX - i - 1];
 }
 if (s1 != sum || s2 != sum)
  return 0;
 return 1;
}
int main()
{
 int i, j;
 int a[MAX][MAX];
 for (i = 0; i < MAX; i++)
  for (j = 0; j < MAX; j++)
   scanf("%d ", &a[i][j]);


 if (Fun(a) == 1)
 {
  printf("It is a magic square!\n");
  for (int i = 0; i<MAX; i++)
  {
   for (int j = 0; j < MAX; j++)
    printf("%4d", a[i][j]);
   printf("\n");
  }
 }
 else
  printf("It is not a magic square!\n");

 return 0;
}

/最后一题打个备注,因为有思路就贴了一下别人的代码,https://www.cnblogs.com/didiaoxiaoguai/p/6749632.html,这里是原帖地址,有兴趣的同学可以看一下。/
1.使用使用char型二元数组输入矩阵
2.观察主副对角线规律1 3 5 7 9,求和
3.行列求和,判断是否相等
4.如果相等则输出,不相等输出not

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值