东魏的猴子 2024-06-17 21:07 采纳率: 95.6%
浏览 125
已结题

猜数字一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家

7-40 猜数字
作者 陈越
单位 浙江大学
一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:
输入在第一行给出一个正整数N(≤10
4
)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例:
22 Amy

#include<stdio.h>
struct xx{
    char name[8];
    int grade;
};
int main()
{
    struct xx s[100];
    int n,sum=0,h=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s %d",s[i].name,s[i].grade);
        sum+=s[i].grade;
    }
    sum=sum/2;
    for(int j=1;j<n;j++)
    {
        int min=s[0].grade;
        if(abs(s[j].grade-sum)<min)
        {
            min=abs(s[j].grade-sum);
            h=j;
        }
    }
    printf("%d %s",sum,s[h].name);
}

答案显示段错误,请问哪里错呢?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-17 21:07
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,主要的问题在于你没有正确地初始化min变量,并且在计算平均数一半时没有正确处理除法。此外,你的查找最接近平均数一半的逻辑也有误,因为它只比较了当前元素与第一个元素,而没有考虑整个数组。以下是修改后的代码:

    #include<stdio.h>
    
    struct xx{
        char name[8];
        int grade;
    };
    
    int main()
    {
        struct xx s[100];
        int n, sum = 0, half_avg, closest_index = 0;
        scanf("%d", &n);
    
        // Read all grades and calculate the total sum.
        for (int i = 0; i < n; i++) {
            scanf("%s %d", s[i].name, &s[i].grade);
            sum += s[i].grade;
        }
    
        // Calculate the average and then its half, truncating the decimal part.
        half_avg = sum / (2 * n);
    
        // Initialize minimum difference to maximum possible value.
        int min_diff = 100;
    
        // Find the index of the player whose guess is closest to half of the average.
        for (int j = 0; j < n; j++) {
            int current_diff = abs(s[j].grade - half_avg);
            if (current_diff < min_diff) {
                min_diff = current_diff;
                closest_index = j;
            }
        }
    
        // Output the result.
        printf("%d %s", half_avg, s[closest_index].name);
    
        return 0;
    }
    

    关键修改点:

    1. 初始化min_diff为最大可能值100,因为所有猜测的数字都在100以内。
    2. 正确计算平均数的一半,注意要先乘以2再除以n,以确保在计算一半之前先计算平均值。
    3. 在循环中遍历所有玩家,找到与half_avg差值最小的那个玩家。

    这个版本应该能正确运行并给出正确的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月26日
  • 已采纳回答 12月26日
  • 创建了问题 6月17日