约瑟夫环问题(数组法)c语言实现



#include <stdio.h>

// 约瑟夫环问题的数组法实现
// n 表示总人数,m 表示报数间隔
void josephus(int n, int m) {
    if (n < 1 || m < 1) return; // 参数合法性检查

    int people[n]; // 初始化一个数组,模拟围成一圈的人
    for (int i = 0; i < n; i++) {
        people[i] = i + 1; // 假设编号从1开始
    }

    int index = 0; // 当前报数到的人的位置
    while (n > 1) { // 当圈中人数大于1时继续
        // 报数到m时,该人出列
        for (int count = 1; count < m; count++) {
            index = (index + 1) % n; // 环形移动指针
        }
        printf("出列的人是:%d\n", people[index]); // 输出出列的人

        // 将出列的人从数组中移除
        for (int j = index; j < n - 1; j++) {
            people[j] = people[j + 1];
        }
        n--; // 圈中人数减一
        index = (index + 1) % n; // 更新指针到下一个人的位置
    }

    // 最后剩下的一个人
    printf("最后剩下的人是:%d\n", people[0]);
}

int main() {
    int n, m;
    printf("请输入总人数 n 和报数间隔 m:");
    scanf("%d %d", &n, &m);
    josephus(n, m);
    return 0;
}

上述C语言代码实现了约瑟夫环问题的数组法解决方案。用户输入总人数`n`和报数间隔`m`,程序会模拟整个出列过程,并输出每次出列的人以及最后剩下的人。注意,此实现中数组的下标从0开始,但为了方便理解,人的编号从1开始,并在输出时进行了相应的调整。