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

CS50 pset3 runoff程序check50全通过 手动测试输出错误求排查

问题定位

问题出在find_min函数的实现逻辑上:你为了查找最低票数,直接对candidates结构体数组进行冒泡排序,但排序过程中只交换了votes票数和eliminated淘汰状态,没有同步交换name字段,这就导致候选人的姓名和他的得票、淘汰状态完全错位,最终计算逻辑完全错误。

比如你给出的测试用例第一轮计票后,候选人初始状态为:

  • 索引0:Alice,得票2,未淘汰
  • 索引1:Bob,得票2,未淘汰
  • 索引2:Charlie,得票1,未淘汰

排序时你交换了索引0和索引2的votes、eliminated字段后,状态变成了:

  • 索引0:name还是Alice,得票变成1,未淘汰
  • 索引2:name还是Charlie,得票变成2,未淘汰

此时你找最低未淘汰候选人得票时,会误以为Alice得票1是最低值,后续淘汰逻辑把Alice错误淘汰,最终剩下的候选人计票后自然就输出了Bob。

修复方案

不要修改原candidates数组的顺序,直接遍历所有未淘汰的候选人找最低票数即可,修改后的find_min参考代码如下:

int find_min(void)
{
    int min = voter_count; // 初始设为最大可能票数
    for (int i = 0; i < candidate_count; i++)
    {
        // 只统计未淘汰的候选人
        if (!candidates[i].eliminated && candidates[i].votes < min)
        {
            min = candidates[i].votes;
        }
    }
    return min;
}

你原来的排序逻辑完全没有必要,反而引入了字段不同步的bug,修改后即可得到正确结果。

内容的提问来源于stack exchange,提问作者Francesca Di Paola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:48:01