鱼C论坛

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

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

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

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

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

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

输入描述
多组输入。

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

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

第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。
#include<stdio.h>
int main()
{
    int a[15],n,i,sum=1,av;
    while(scanf("%d",&n)!=EOF)
    {
    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);
    }
}
最佳答案
2023-10-11 22:16:35
问题在于:当输入多组数据时,每次循环结束后没有将 sum 归零,导致每次计算平均数时使用的 sum 值是上一次循环的结果,从而得到错误的答案。

以下是修改后的代码:
#include<stdio.h>int main() {    int a[15], 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;}
我们在每次循环开始之前将 sum 归零,以确保计算平均值时使用的是当前循环的数字总和。这样就可以正确地输出小于、等于、大于平均值的数字数量了。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-11 22:16:14 | 显示全部楼层
代码有一个小问题,sum初始值应该为0而不是1。否则会导致求出的平均数有误差。另外,可以考虑加上一些注释,提高代码的可读性。修改后的代码如下:
#include<stdio.h>
int main()
{
    int a[15], 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

以下是修改后的代码:
#include<stdio.h>int main() {    int a[15], 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;}
我们在每次循环开始之前将 sum 归零,以确保计算平均值时使用的是当前循环的数字总和。这样就可以正确地输出小于、等于、大于平均值的数字数量了。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 07:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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