2021-06-15

C语言程序设计
第八周
1摘苹果
题目内容:
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当他不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度(已知在100cm到200cm之间,包括100cm和200cm),以及陶陶把手伸直时能达到的最大高度(已知在100cm到120cm之间,包括100cm和120cm),请你编写程序帮助陶陶计算一下他能摘到的苹果数目。假设他碰到苹果,苹果就会掉下来。

函数原型:int GetApple(int a[], int height, int n);

函数功能:计算淘淘能摘到的苹果数目

函数参数:数组a保存苹果到地面的高度;height代表陶陶把手伸直时能达到的最大高度;n为苹果数

函数返回值:淘淘能摘到的苹果数目
程序

#include <stdio.h>
int GetApple(int a[], int height, int n);
int main()
{
   int a[10],height,x;
   int n=10;
   for(int i=0;i<n;i++)
   {
      scanf("%d",&a[i]);

   }
  
  scanf("%d",&height);
  x=GetApple(a,height,n);
  printf("%d",x);
    return 0;
}
int GetApple(int a[], int height, int n)
{
    int x=0;
    for(int i=0;i<n;i++)
    {
       if(a[i]<=30+height)
       {
           x++;
       }
    }
    return x;
}


2好数对
题目内容:
已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。

注:集合中最多有1000个元素,元素最大不超过10000

#include <stdio.h>
int main()
{
  int a[1000],n,count=0;
  scanf("%d",&n);
  for(int i=0;i<n;i++)
  {
      scanf("%d",&a[i]);
  }
  for(int i=0;i<n-1;i++)
  {
      for(int j=i+1;j<n;j++)
      {
          for(int k=0;k<n;k++)
          {
              if(a[k]==a[i]+a[j])
                count++;
          }
      }
  }
  printf("%d",count);
    return 0;
}

3组合三位数
题目内容:
将0到9这十个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的1/2,是第三个3位数的1/3。问应当怎样分,编写程序实现。

#include <stdio.h>
int main()
{
  int a[9],b[9],x[3],sum=0,k;

  for(x[0]=100;x[0]<333;x[0]++)
  {
      for(int i=0;i<9;i++)
     {
      a[i]=-1;
     }

     x[1]=2*x[0];
     x[2]=3*x[0];
     int i=-1;
     do
     {   i++;
         b[i]=x[i]/100;
         b[i+3]=x[i]/10%10;
         b[i+6]=x[i]%10;

     }while(i<2);
     sum=0;
   for(int j=0;j<9;j++)
   {

     for(k=0;a[k]!=-1;k++)
     {
       if(b[j]==a[k])
            break;
     }
     if(a[k]==-1)
     {
       a[k]=b[j];
       sum++;
     }
   }
   if(sum==9)
  {
   printf("%d,%d,%d\n",x[0],x[1],x[2]);
  }

  }

    return 0;
}

4求100以内的最大素数
题目内容:
编程计算n(n<=500)以内的10个最大素数及其和,分别输出这最大的10个素数及其和。n的值要求从键盘输入。要求10个素数按从大到小的顺序输出。

#include <stdio.h>
int main()
{
  int n,sum=0,flag,count=0;
  printf("Input n(n<=500):");
  scanf("%d",&n);
  for(int i=n;i>=2;i--)
  {
      flag=0;
      for(int j=2;j<i;j++)
      {
          if(i%j==0)
           {
            flag=1; break;
           }
      }
      if(flag==0&&count<10)
      {
      printf("%6d",i);
      sum+=i;
      count++;
      }

  }
  printf("\nsum=%d\n",sum);
    return 0;
}

1三天打渔两天晒网(4分)
题目内容:
中国有句俗语叫“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”,即工作三天,然后再休息两天。问这个人在以后的某一天中是在工作还是在休息。从键盘任意输入一天,编程判断他是在工作还是在休息,如果是在工作,则输出:He is working,如果是在休息,则输出:He is having a rest,如果输入的年份小于1990或者输入的月份和日期不合法,则输出:Invalid input。

#include <stdio.h>
int main()
{
    int year,month,date,sum,flag=1;
    scanf("%4d-%2d-%2d",&year,&month,&date);
    if(year<1990||month<0||month>12||date<0||date>31)
    {
        printf("Invalid input" );flag=0;
    }
   else  if((year%4==0&&year%4!=0)||year%400==0)
     {
         if(month>2)
         {
             if(month%2)
             {
                 sum=date+(month/2)*31+28+(month/2-1)*30;
             }
             else
             {
                 sum=date+(month/2)*31+28+(month/2-2)*30;
             }
         }
         else
         {
           sum=date+31;
         }
     }
     else
     {
         if(month>2)
         {
             if(month%2)
             {
                 sum=date+(month/2)*31+29+(month/2-1)*30;
             }
             else
             {
                 sum=date+(month/2)*31+29+(month/2-2)*30;
             }
         }
         else
         {
           sum=date+31;
         }
     }
     if(flag==1)
     {
        switch(sum%5)
     {
        case 0:{printf("He is having a rest");break;}
        case 1:
        case 2:
        case 3:{printf("He is working");break;}
        case 4:{printf("He is having a rest");break;}
     }
     }


    return 0;
}

2统计用户输入(4分)
题目内容:

从键盘读取用户输入直到遇到#字符,编写程序统计读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。(要求用getchar()输入字符)

#include <stdio.h>
int main()
{
    char ch='0';
    int n1=0,n2=0,n3=0;
    printf("Please input a string end by #:\n");
    while(ch!='#')
    {
        ch=getchar();
        if(ch==' ')
        {
            n1++;
        }
        else if(ch=='\n')
        {
            n2++;
        }

       else if(ch!='#')
        {
            n3++;
        }

    }

printf ("space: %d,newline: %d,others: %d\n",n1,n2,n3);

    return 0;
}

3统计正整数中指定数字的个数(4分)
题目内容:

从键盘输入一个正整数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 main()
{
   int m,n,x;
   printf("Input m,n:\n");
   scanf("%d,%d",&m,&n);
   x=CountDigit(m,n);
   printf("%d\n",x);

    return 0;
}
int CountDigit(int number,int digit)
{
    int n=0;

   do
   {
    if(number%10==digit)
    {
        n++;
    }
       number=number/10;
   }while(number);
    return n;

}

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

#include <stdio.h>
#include <math.h>
int main()
{
    int a[4],sum=0;
 for(int i=1000;i<10000;i++)
 {
     sum=0;
     int j=i;
     int k=0;
     while(k<4)
     {
       a[k]=j%10;
       j=j/10;
       k++;
     }
     for(int k=0;k<4;k++)
     {
         sum+=pow(a[k],4);
     }
     if(i==sum)
     printf("%d\n",i);
 }

    return 0;
}

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

#include <stdio.h>
#include <math.h>
int main()
{
    int a[4],sum=0;
 for(int i=1000;i<10000;i++)
 {
     sum=0;
     int j=i;
     int k=0;
     while(k<4)
     {
       a[k]=j%10;
       j=j/10;
       k++;
     }
     for(int k=3;k>=0;k--)
     {
         sum+=a[3-k]*pow(10,k);
     }
     if(9*i==sum)
     printf("%d\n",i);
 }

    return 0;
}

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

#include <stdio.h>
#include <math.h>
int main()
{
    int a,b;
  for(int i=9;;i++)
  {
      a=i/8/8/8;
      b=i/17/17;
      if(i%8==1&&i/8%8==1&&i/8/8%8==7&&i%17==4&&i/17%17==15&&b==2*a)
      {
          printf("%d\n",i);
          break;
      }
  }



    return 0;
}

7矩阵转置v1.0
注:输入不要带有换行符
题目内容:
用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入

#include <stdio.h>
#include <math.h>
int main()
{
 int n,a[10][10],b[10][10];
 printf("Input n:");
 scanf("%d",&n);
 printf("Input %d*%d matrix:\n",n,n);
 for(int i=0;i<n;i++)
 {
     for(int j=0;j<n;j++)
     {
         scanf("%d",&a[i][j]);
         b[j][i]=a[i][j];
     }

 }
 printf("The transposed matrix is:\n");
for(int i=0;i<n;i++)
 {
     for(int j=0;j<n;j++)
     {
       printf("%4d",b[i][j]);
     }
     printf("\n");
 }

    return 0;
}

8兔子生崽问题(4分)
题目内容:
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n<=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题,n的值要求从键盘输入。
参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:
(1)每月小兔对数 = 上个月成兔对数。
(2)每月成兔对数 = 上个月成兔对数 + 上个月小兔对数。
综合(1)和(2)有:每月成兔对数 = 前两个月成兔对数之和。

#include <stdio.h>
int main()
{
 int n,total=1,a[10],b[10];
 printf("Input n(n<=12):\n");
 scanf("%d",&n);

   a[0]=1;
   b[0]=0;
   for(int i=1;i<n;i++)
{
    printf("%4d",total);
    a[i]=a[i-1]+b[i-1];
    b[i]=a[i-1];
    total=a[i]+b[i];
}
printf("%4d",total);
printf( "\nTotal=%d\n",total);



    return 0;
}

9抓交通肇事犯
题目内容:
一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
[提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数
k = 1000i + 100i + 10j + j
式中,i和j都在0~9变化。此外,还应使k=m
m,m是整数。由于k是一个4位数,所以m值不可能小于31。

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

    return 0;
}

10检验并打印幻方矩阵(4分)
题目内容:

幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个5×5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。

输入格式: “%d”

输出格式:

如果是幻方矩阵,输出提示信息: “It is a magic square!\n”

矩阵元素的输出: “%4d”(换行使用"\n")

如果不是幻方矩阵,输出提示信息: “It is not a magic square!\n”

#include <stdio.h>
int main()
{
int a[5][5],b[12]={0},flag=0;
for(int i=0;i<5;i++)
{
    for(int j=0;j<5;j++)
    {
        scanf("%d",&a[i][j]);
    }
}
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            b[i]+=a[i][j];
        }
    }
    for(int j=0;j<5;j++)
    {
        for(int i=0;i<5;i++)
        {
            b[j+5]+=a[i][j];
        }
    }
    for(int i=0;i<5;i++)
    {
        b[10]+=a[i][i];
        b[11]+=a[i][4-i];
    }
  for(int i=0;i<11;i++)
  {
      for(int j=i+1;j<12;j++)
      {
          if(b[i]!=b[j])
          {
             flag=1; break;
          }
      }
      if(flag)
      {
          break;
      }
  }
  if(flag)
  {
      printf("It is not a magic square!\n");
  }
  else
  {
     printf("It is a magic square!\n");
    for(int i=0;i<5;i++)
{
    for(int j=0;j<5;j++)
    {
        printf("%4d",a[i][j]);
    }
    printf("\n");
}
  }

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值