约瑟夫环(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语言实现如上,可根据需要选择递归或迭代方式。
如需进一步优化或打印过程,请告诉我!