josephus问题c语言实现
时间: 2024-10-15 10:21:39 浏览: 48
c语言课程设计案例40例源代码(上)
Josephus问题是这样的一个经典问题:给定一组人数n和一个步长k,从这个人数组列中按照逆时针方向删除第k个人,并继续对剩下的每个人按照同样的规则执行此操作,直到剩下最后一个人为止。这个过程可以使用递归或者循环结合数组索引来解决。
以下是C语言的一个简单实现,使用循环避免了递归带来的栈溢出风险:
```c
#include <stdio.h>
int josephus(int n, int k) {
if (n == 1 || k >= n) { // 如果只剩一人或者步长大于等于人数,直接返回0
return 0;
}
for (int i = 0; i < n - 1; ++i) { // 循环执行删除步骤
if ((i + 1) % k == 0) { // 当轮到第k个人时
i++; // 跳过这个人,下一次循环再处理
}
}
return i + 1; // 返回最后一个存活的人的位置
}
int main() {
int n, k;
printf("请输入人数n和步长k: ");
scanf("%d %d", &n, &k);
int result = josephus(n, k);
printf("在Josephus游戏中,第%d个人将幸存。\n", result);
阅读全文