约瑟夫环问题C语言实现异常,Python版本正常,求排查修复
约瑟夫环变种问题:C代码转写错误分析与修复
问题描述
n个机器人围成一圈,初始全处于开启状态。首轮关闭1号机器人,之后从当前位置开始数k个开启的机器人并关闭,直至仅剩1个机器人,需要输出所有机器人的关闭顺序。
已实现的Python代码可正常运行(如n=13、k=2时输出正确序列),但转写后的C代码输出结果异常,相同参数下输出序列为1 3 4 5 6 7 8 9 10 11 12 13,与预期不符。
错误原因分析
对比Python与C代码的核心逻辑差异,问题出在数组元素删除的循环操作中修改了循环变量i的值:
- Python代码中,
removal函数的参数i是局部变量,执行数组移位时仅修改局部的i,不会影响外部用于定位下一个待删除元素的i变量。 - C代码中,删除元素时直接使用全局的
i进行数组移位,循环中i持续自增,导致原本用于定位下一个元素的i值被破坏,后续的索引计算完全错误。
比如首次删除操作后,Python中i仍保持为0,后续执行i +=k-1得到正确的下一个索引;而C代码中i在删除循环中被自增到12(初始n=13),后续的索引计算完全偏离预期逻辑。
修复后的C代码
修改删除元素的逻辑,使用临时变量执行数组移位,避免破坏原有的i值:
#include <stdio.h> int main() { int n , k; scanf("%d" , &n); scanf("%d" , &k); int len = n; int first[n + 1]; int j = 0; while (j < n) { first[j] = j + 1; j++; } int result[n - 1]; int i = 0; j = 0; while (n > 1) { result[j] = first[i]; j++; // 使用临时变量temp_i执行移位,不修改原i的值 int temp_i = i; while (temp_i < n-1) { first[temp_i] = first[temp_i + 1]; temp_i++; } n--; i += (k-1); i %= n; } j = 0; while (j < len-1) { printf("%d " , result[j]); j++; } return 0; }
验证结果
输入n=13、k=2时,修复后的C代码输出正确的关闭序列:1 3 5 7 9 11 13 4 8 2 10 6,与Python代码的输出一致。
内容的提问来源于stack exchange,提问作者Vesal E.a
相关产品推荐
相关产品推荐

