网站首页 网站地图
网站首页 > 游戏秘籍 > 约瑟夫出圈问题c语言

约瑟夫出圈问题c语言

时间:2026-04-01 08:57:22

约瑟夫环(Josephus Problem)是一个经典的数学问题,通常用于计算在特定规则下,人们围成一圈,每次删除一个人,最后剩下的人是谁。

约瑟夫环问题(C语言实现)

假设你有 n 个人围成一圈,每次数到第 k 个人,然后将其从圈中删除。问最后剩下的是谁?

问题描述(C语言实现):

#include <stdio.h>

// 函数:约瑟夫环问题的递归解法
int josephus_recursive(int n, int k) {
    if (n == 1) {
        return 0; // 从0开始计数
    }
    return (josephus_recursive(n - 1, k) + k) % n;
}

// 函数:约瑟夫环问题的迭代解法
int josephus_iterative(int n, int k) {
    int res = 0;
    int i = 2;
    while (i <= n) {
        res = (res + k) % i;
        i++;
    }
    return res;
}

int main() {
    int n, k;
    printf("请输入人数 n 和步长 k: ");
    scanf("%d %d", &n, &k);

    if (n <= 0) {
        printf("人数不能为0或负数。\n");
        return 1;
    }

    // 递归解法
    int res_recursive = josephus_recursive(n, k);
    printf("递归解法结果: %d\n", res_recursive);

    // 迭代解法
    int res_iterative = josephus_iterative(n, k);
    printf("迭代解法结果: %d\n", res_iterative);

    return 0;
}

示例运行:

假设输入:

请输入人数 n 和步长 k: 5 3

输出:

递归解法结果: 3
迭代解法结果: 3

说明:

  • 递归解法:josephus_recursive(n, k) 会递归地计算第 n 个人的位置。
  • 迭代解法:从 i = 2 开始,逐步计算每个位置的值,直到 i = n

扩展:

如果你想要打印出整个过程,可以添加一个打印数组的函数,例如:

void print_circle(int n, int k, int* arr) {
    for (int i = 0; i < n; i++) {
        printf("第 %d 个人: %d\n", arr[i], arr[i]);
    }
}

然后在 main 中调用这个函数。

总结:

约瑟夫环问题可以通过递归或迭代方法解决,C语言实现如上,可根据需要选择递归或迭代方式。

如需进一步优化或打印过程,请告诉我!