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

CS50 Pset3 Runoff:Tabulate函数中preferences[i][j]实现疑问

实现tabulate函数统计有效选票

你的代码存在几个关键错误,导致无法正确统计选票,下面是修正思路和正确实现:

原代码的问题

  • 索引混淆:你用选民的索引i去访问candidates[i],但i是选民编号,不是候选人编号,应该用preferences[i][j]得到的候选人编号来操作对应候选人
  • 错误修改偏好数组:preferences[i][j]=i是多余且错误的,preferences数组用来存储选民的投票顺序,不能在统计时修改它
  • 逻辑偏差:内层循环的判断条件错误,应该检查preferences[i][j]对应的候选人是否未被淘汰,而不是当前选民相关的候选人

正确实现代码

// 统计未被淘汰候选人的选票
void tabulate(void)
{
    // 遍历每一位选民
    for (int i = 0; i < voter_count; i++)
    {
        // 遍历当前选民的偏好列表,找到第一个未被淘汰的候选人
        for (int j = 0; j < candidate_count; j++)
        {
            int candidate_index = preferences[i][j];
            // 如果该候选人未被淘汰,给他加一票并跳出当前选民的循环
            if (!candidates[candidate_index].eliminated)
            {
                candidates[candidate_index].votes++;
                break;
            }
        }
    }
    return;
}

代码说明

  • 外层循环遍历每一位选民(i是选民索引)
  • 内层循环遍历当前选民的偏好顺序(j是偏好顺位)
  • 用preferences[i][j]获取当前顺位对应的候选人编号,存储到candidate_index
  • 检查该候选人是否未被淘汰:!candidates[candidate_index].eliminated(等同于candidates[candidate_index].eliminated == false)
  • 找到第一个有效候选人后,给他的票数加1,然后break跳出内层循环,不再处理该选民的后续偏好
  • 所有选民处理完后,函数结束

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:35:40