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

CS50 Plurality问题print_winner函数仅Bob测试用例失败排查

CS50 Plurality 题目print_winner函数逻辑问题说明

你提交的print_winner函数存在3个核心逻辑错误,是导致官方检测大部分用例不通过的原因:

  • 未做真正的元素交换,直接覆盖原始数据
    代码判断到索引i的候选人得票高于数组最后一位候选人时,直接把最后一位的votes和name赋值为i位置的值,原最后一位候选人的得票数据被直接覆盖丢失,后续做同票比对时用的是被篡改过的数据,根本无法正确识别所有符合条件的获胜者。
  • 循环逻辑完全无效,边界错误
    内层循环定义的变量j在整个循环体中从未被使用,属于无意义的冗余循环;同时循环边界设置错误,遍历过程无法覆盖所有候选人的得票比对场景,会漏掉部分高得票候选人的判断。
  • 实现思路冗余易错,不必要修改原数组
    找最高获胜者根本不需要修改、挪动原candidates数组的存储内容,你当前的排序/换位思路本身就增加了出错概率。

正确的实现逻辑非常简单,全程不需要改动原始候选人数据:

  1. 第一遍遍历所有候选人,记录下全局最高得票数
  2. 第二遍遍历所有候选人,把得票数等于最高值的候选人姓名全部打印即可,天然支持多候选人同票并列获胜的场景。

修正后的参考代码:

// Print the winner (or winners) of the election
void print_winner(void)
{
    // 遍历获取最高得票数
    int max_vote = 0;
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes > max_vote)
        {
            max_vote = candidates[i].votes;
        }
    }

    // 输出所有得票等于最高值的候选人
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes == max_vote)
        {
            printf("%s\n", candidates[i].name);
        }
    }
    return;
}

你提到的仅Bob相关测试项通过,是因为该组测试用例中Bob刚好是你错误遍历逻辑能覆盖到的最高得票者,其余测试用例的最高得票者不在你错误逻辑的覆盖范围内,加上原始数据被覆盖篡改,自然全部无法通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:21:37