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

CS50 Pset3 Runoff问题:tabulate函数投票统计异常

修复Runoff选举程序的Tabulate函数问题

问题分析

你的tabulate函数存在两处关键逻辑错误,导致票数统计异常:

  1. 未完整遍历选民偏好:原代码中每个选民的偏好循环仅执行一次就break,无法找到第一个未被淘汰的候选人——如果选民的第一偏好被淘汰,直接给第二偏好加票,但未验证第二偏好是否也被淘汰,更不会继续往后查找有效偏好。
  2. 数组越界风险:当j为最后一个候选人索引时,j+1会超出preferences数组的合法范围,引发未定义行为,可能错误地给无关候选人加票。

修复后的Tabulate函数

替换原tabulate函数为以下代码:

// Tabulate votes for non-eliminated candidates
void tabulate(void)
{
    // 遍历所有选民
    for (int i = 0; i < voter_count; i++)
    {
        // 遍历当前选民的所有偏好,直到找到未被淘汰的候选人
        for (int j = 0; j < candidate_count; j++)
        {
            int candidate_idx = preferences[i][j];
            if (!candidates[candidate_idx].eliminated)
            {
                candidates[candidate_idx].votes++;
                break; // 找到有效偏好,停止当前选民的偏好遍历
            }
        }
    }
    return;
}

修复逻辑说明

  • 对每个选民,依次遍历其所有偏好顺序
  • 找到第一个未被淘汰的候选人时,为该候选人增加一票,然后跳出当前选民的偏好循环(确保每个选民只投一票)
  • 完全避免了数组越界问题,也能正确处理多轮淘汰后的选票转移

验证效果

修复后,程序会正确统计每轮的有效票数:在你提到的测试案例中,5位选民的选票会正确分配给第一个未被淘汰的候选人,最终b将获得多数票成为唯一胜者,解决tabulate handles multiple rounds of preferences的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:30:33