c语言写一个班有12个同学,现统计考试成绩大于60分,等于69分,小于60分的人数

一个班有12个同学,现统计考试成绩大于60分,等于69分,小于60分的人数

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7547440
  • 除此之外, 这篇博客: C语言编程之换硬币中的 现在有这样一道题。假设给你一分硬币,两分硬币,五分硬币共60枚。需要将它们兑换成100分的硬币,可以怎么换? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 而我们可以列出如下关系式
    假设x,y,z分别为一分,两分,五分硬币则:
    x+y+z=60
    x+2y+5z=100
    对于这道题我们应该不太陌生,而我们最常见的应该是用三重循环来解决问题,又因为其为三重循环则需要三个未知数:
    代码如下:

    #include<stdio.h>
    int main(void)
    {
     int coin1,coin2,coin5;
     for(coin1=0;coin1<=60;coin1++)//一分硬币可以等于硬币总数最大值,不超过100分 
      for(coin2=0;coin2<=50;coin2++)//两分五分硬币数目最大不应超过钱数/其面额 
       for(coin5=0;coin5<=20;coin5++)//减少循环次数,降低其时间复杂度
       {
        if(coin1+coin2+coin5==60&&1*coin1+2*coin2+5*coin5==100)
        printf("一分硬币%d枚,两分硬币%d枚,五分硬币%d枚\n",coin1,coin2,coin5);
       } 
     return 0;
    } 

    而这也是暴力解法,三重循环则会使其时间复杂度为O(n3),我们应降低其循环次数
    若用二重循环,则需要两个未知数,我们只需将以上关系式消去一个未知数,当然消去哪个都可以,(我消去的是x)在我们利用了加减消元法之后可以得到以下关系式:
    y+4z=40
    最后再利用x=60-y-z,得到x即可
    代码如下:

    #include<stdio.h>
    int main(void)
    {
     int coin1,coin2,coin5;
     for(coin2=0;coin2<=50;coin2++)
       for(coin5=0;coin5<=20;coin5++)//减少循环次数,降低其时间复杂度
       {
        if(coin2+4*coin5==40)
        {
         coin1=60-coin2-coin5;
         printf("一分硬币%d枚,两分硬币%d枚,五分硬币%d枚\n",coin1,coin2,coin5);
        }
       } 
     return 0;
    } 

    而最后的优化就是时间复杂度最低的一重循环了,所以我们应想办法将其变为一个未知数代替的关系式,而这需要我们找寻其隐含的条件。
    我们可以将y,z变为关于x的关系式,即:
    由y+4z=40,x+y+z=60得
    z=1/3(x-20)
    y=1/3(200-4x)
    而且y,z必须大于等于0则有20<=x<=50
    梳理完毕,代码如下:

    #include<stdio.h>
    int main(void)
    {
     int coin1,coin2,coin5;
     for(coin1=20;coin1<=50;coin1++)
          {
           coin5=(coin1-20)/3;
           coin2=(200-4*coin1)/3;
       if(coin1+coin2+coin5==60)
         printf("一分硬币%d枚,两分硬币%d枚,五分硬币%d枚\n",coin1,coin2,coin5);           
        }
     return 0;
    } 

    这就是换硬币循环的逐步优化了,总而言之就是几重循环需要几个未知数,最后只需寻找其潜在关系。这需要我们努力思考,fighting!

供参考:

#include <stdio.h>
int main()
{
    int score[12],i,score1=0,score2=0,score3=0;
    for (i = 0;i < 12; i++)
    {
        scanf("%d", &score[i]);
        if (score[i] > 60){
            score1++;
            if (score[i] == 69)
                score2++;
        }
        else if (score[i] < 60)
            score3++;
    }
    printf("score>60: %d, score=69: %d, score<60: %d",score1,score2,score3);
    return 0;
}


#include <stdio.h>

int main()
{
    int num[3] = { 0 }, a;
    for (int i = 0; i < 12; i++) {
        scanf("%d", &a);
        if (a < 60)num[0]++;
        else if (a == 60)num[1]++;
        else num[2]++;
    }
    printf("60分以下有%d人,60分有%d人,60分以上有%d人。", num[0], num[1], num[2]);
    return 0;
}

#include <stdio.h>
void reverse(int b[],int n);//函数声明与函数定义中的第一行相同,并以分号结束
int main()
{ int a[30],i,n;
  printf("Enter n:");
  scanf("%d",&n);//屏幕上会显示出输入的数字
  printf("Enter %d integers:",n);//先输入才可输出包含该输入的语句
  for(i=0;i<=n-1;i++)
    scanf("%d",&a[i]);
  reverse(a,n);//见注释3
  for(i=0;i<=n-1;i++)
    printf("%3d",a[i]);//
  printf("\naddress of a[]:%p\n",a);//实参数组a的首地址
  return 0;
}
void reverse(int b[],int n)//见注释3
{ int i,j,t;
  for(i=0,j=n-1;i<j;i++,j--)
  { t=b[i];
    b[i]=b[j];
    b[j]=t;
  }
  printf("address of b[]:%p\n",b);//形参数组b的首地址,b=&b[0]
}