初莫M 发表于 2023-10-11 22:15:51

代码有什么问题啊

题目描述
某天小鑫忽然得到了许多的数字,他很好学,老师给他布置了一个任务,求出这些数字中,小于他们平均数、等于他们平均数、大于他们平均数的数字的数量是多少。(对于出现的平均数,保证都是整数,不会出现浮点数)

输入描述
多组输入。

对于每次的输入,第一行一个整数N
(1≤N≤10
),代表数字的个数。
接下来的一行,输入N
个整数M
(0≤M≤100
)。

输出描述
输出包含三个数,第一个跟第二个数后面是空格,最后一个数后面是换行。

第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。
#include<stdio.h>
int main()
{
    int a,n,i,sum=1,av;
    while(scanf("%d",&n)!=EOF)
    {
    for(i=0;i<n;i++)
    {
      scanf("%d",&a);
      sum+=a;
    }
    av=sum/n;
    int sma=0,sav=0,smi=0;
    for(i=0;i<n;i++)
    {
      if(a==av) sav++;
      if(a>av) sma++;
      if(a<av) smi++;
    }
      printf("%d %d %d\n",smi,sav,sma);
    }
}

isdkz 发表于 2023-10-11 22:16:14

代码有一个小问题,sum初始值应该为0而不是1。否则会导致求出的平均数有误差。另外,可以考虑加上一些注释,提高代码的可读性。修改后的代码如下:

#include<stdio.h>
int main()
{
    int a, n, i, sum = 0, av;
    while(scanf("%d", &n) != EOF)
    {
      sum = 0; // 每次循环前需要将sum清零
      for(i = 0; i < n; i++)
      {
            scanf("%d", &a[ i]);
            sum += a[ i];
      }
      av = sum / n;
      int sma = 0, sav = 0, smi = 0;
      for(i = 0; i < n; i++)
      {
            if(a[ i] == av) sav++;
            if(a[ i] > av) sma++;
            if(a[ i] < av) smi++;
      }
      printf("%d %d %d\n", smi, sav, sma);
    }
    return 0;
}

Mike_python小 发表于 2023-10-11 22:16:35

问题在于:当输入多组数据时,每次循环结束后没有将 sum 归零,导致每次计算平均数时使用的 sum 值是上一次循环的结果,从而得到错误的答案。

以下是修改后的代码:


#include<stdio.h>

int main() {
    int a, n, i, sum = 0, av;
    while(scanf("%d", &n) != EOF) {
      sum = 0; // 每次循环前将 sum 归零
      for(i = 0; i < n; i++) {
            scanf("%d", &a);
            sum += a;
      }
      av = sum / n;
      int sma = 0, sav = 0, smi = 0;
      for(i = 0; i < n; i++) {
            if(a == av) sav++;
            if(a > av) sma++;
            if(a < av) smi++;
      }
      printf("%d %d %d\n", smi, sav, sma);
    }
    return 0;
}


我们在每次循环开始之前将 sum 归零,以确保计算平均值时使用的是当前循环的数字总和。这样就可以正确地输出小于、等于、大于平均值的数字数量了。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 代码有什么问题啊