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
相关产品推荐
相关产品推荐

