You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Pset3 Runoff:print_winner函数系统测试失败求助

问题现象

手动输入测试时函数运行正常,但官方系统测试未通过两项检查:

  • 当候选人获得多数票时,print_winner未打印获胜者姓名
  • 当候选人获得多数票时,print_winner未打印获胜者并返回true

原代码

int votes_need;

// printf("votes needed: %i\n", votes_need);
for (int i = 0; i < candidate_count; i++)
{
    if (voter_count % 2 != 0)
    {
        votes_need = ((voter_count + 1 )/ 2);

        if (candidates[i].votes >= votes_need)
        {
            printf("%s\n", candidates[i].name);
            return true;
        }
        else
        {
            printf("no winner yet!!!\n");
            return false;
        }
    }
    else
    {
        votes_need = ((voter_count)/ 2);

        if (candidates[i].votes > votes_need)
        {
            printf("%s\n", candidates[i].name);
            return true;
        }
        else
        {
            printf("no winner yet!!!\n");
            return false;
        }
    }
}
return false;

核心错误分析

  1. 循环提前终止:循环仅检查第一个候选人后就直接返回。如果第一个候选人未达标,函数立即返回false,完全不会检查后续候选人,导致存在其他达标候选人时无法被识别。
  2. 冗余计算:votes_need在循环内重复计算,每次迭代都重新计算一次,既低效又没必要。
  3. 错误输出干扰:第一个候选人未达标时就打印"no winner yet!!!",但此时可能还有其他候选人满足条件,该输出会干扰系统测试的判断逻辑。

修复后的代码

bool print_winner(int voter_count, candidate_t candidates[], int candidate_count) {
    int votes_need;

    // 一次性计算所需多数票数
    if (voter_count % 2 != 0) {
        votes_need = (voter_count + 1) / 2;
    } else {
        // 偶数情况下,多数票需超过半数,等价于 >= 半数+1
        votes_need = voter_count / 2 + 1;
    }

    // 遍历所有候选人,检查是否有达标者
    for (int i = 0; i < candidate_count; i++) {
        if (candidates[i].votes >= votes_need) {
            printf("%s\n", candidates[i].name);
            return true;
        }
    }

    // 无达标候选人时返回false
    return false;
}

修复说明

  • 将votes_need的计算移至循环外,避免重复计算,提升效率。
  • 移除循环内的提前返回逻辑,确保所有候选人都被检查。
  • 统一多数票判断逻辑:无论票数奇偶,都使用>= votes_need,避免条件混淆。
  • 移除多余的"no winner yet!!!"输出,符合系统测试的输出要求。

内容的提问来源于stack exchange,提问作者rohit narwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:18:30