鱼C论坛

 找回密码
 立即注册
查看: 1404|回复: 2

[已解决]代码有什么问题啊

[复制链接]
发表于 2023-10-11 22:15:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

输入描述
多组输入。

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

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

第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int a[15],n,i,sum=1,av;
  5.     while(scanf("%d",&n)!=EOF)
  6.     {
  7.     for(i=0;i<n;i++)
  8.     {
  9.         scanf("%d",&a[i]);
  10.         sum+=a[i];
  11.     }
  12.     av=sum/n;
  13.     int sma=0,sav=0,smi=0;
  14.     for(i=0;i<n;i++)
  15.     {
  16.         if(a[i]==av) sav++;
  17.         if(a[i]>av) sma++;
  18.         if(a[i]<av) smi++;
  19.     }
  20.         printf("%d %d %d\n",smi,sav,sma);
  21.     }
  22. }
复制代码
最佳答案
2023-10-11 22:16:35
问题在于:当输入多组数据时,每次循环结束后没有将 sum 归零,导致每次计算平均数时使用的 sum 值是上一次循环的结果,从而得到错误的答案。

以下是修改后的代码:
  1. #include<stdio.h>
  2. int main() {
  3.     int a[15], n, i, sum = 0, av;
  4.     while(scanf("%d", &n) != EOF) {
  5.         sum = 0; // 每次循环前将 sum 归零
  6.         for(i = 0; i < n; i++) {
  7.             scanf("%d", &a[i]);
  8.             sum += a[i];
  9.         }
  10.         av = sum / n;
  11.         int sma = 0, sav = 0, smi = 0;
  12.         for(i = 0; i < n; i++) {
  13.             if(a[i] == av) sav++;
  14.             if(a[i] > av) sma++;
  15.             if(a[i] < av) smi++;
  16.         }
  17.         printf("%d %d %d\n", smi, sav, sma);
  18.     }
  19.     return 0;
  20. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-11 22:16:14 | 显示全部楼层
代码有一个小问题,sum初始值应该为0而不是1。否则会导致求出的平均数有误差。另外,可以考虑加上一些注释,提高代码的可读性。修改后的代码如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int a[15], n, i, sum = 0, av;
  5.     while(scanf("%d", &n) != EOF)
  6.     {
  7.         sum = 0; // 每次循环前需要将sum清零
  8.         for(i = 0; i < n; i++)
  9.         {
  10.             scanf("%d", &a[ i]);
  11.             sum += a[ i];
  12.         }
  13.         av = sum / n;
  14.         int sma = 0, sav = 0, smi = 0;
  15.         for(i = 0; i < n; i++)
  16.         {
  17.             if(a[ i] == av) sav++;
  18.             if(a[ i] > av) sma++;
  19.             if(a[ i] < av) smi++;
  20.         }
  21.         printf("%d %d %d\n", smi, sav, sma);
  22.     }
  23.     return 0;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 22:16:35 | 显示全部楼层    本楼为最佳答案   
问题在于:当输入多组数据时,每次循环结束后没有将 sum 归零,导致每次计算平均数时使用的 sum 值是上一次循环的结果,从而得到错误的答案。

以下是修改后的代码:
  1. #include<stdio.h>
  2. int main() {
  3.     int a[15], n, i, sum = 0, av;
  4.     while(scanf("%d", &n) != EOF) {
  5.         sum = 0; // 每次循环前将 sum 归零
  6.         for(i = 0; i < n; i++) {
  7.             scanf("%d", &a[i]);
  8.             sum += a[i];
  9.         }
  10.         av = sum / n;
  11.         int sma = 0, sav = 0, smi = 0;
  12.         for(i = 0; i < n; i++) {
  13.             if(a[i] == av) sav++;
  14.             if(a[i] > av) sma++;
  15.             if(a[i] < av) smi++;
  16.         }
  17.         printf("%d %d %d\n", smi, sav, sma);
  18.     }
  19.     return 0;
  20. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 03:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表