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

约瑟夫环问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:20:01