josephus问题c语言
时间: 2023-10-05 17:09:56 浏览: 170
Josephus 问题是一个经典的问题,描述如下:在固定的人数 N 中,从编号为 1 的人开始报数,报到 M 的人出圈,直到最后只剩下一人,问剩下的人原来的编号是多少?
以下是使用 C 语言解决 Josephus 问题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
int josephus(int n, int m) {
int i, s = 0;
for (i = 2; i <= n; i++) {
s = (s + m) % i;
}
return s + 1;
}
int main() {
int n, m;
printf("请输入人数 N 和报数 M:\n");
scanf("%d%d", &n, &m);
int survivor = josephus(n, m);
printf("最后幸存者的编号是:%d\n", survivor);
return 0;
}
```
在上述代码中,`josephus` 函数使用了数学公式求解最后幸存者的编号,`main` 函数则是读入输入,调用 `josephus` 函数并输出结果。
相关问题
josephus问题c语言实现
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);
josephus问题(ⅲ)c语言
下面是使用递推公式求解 Josephus 问题的 C 语言代码:
```c
#include <stdio.h>
int josephus(int n, int m) {
int f = 0;
for (int i = 2; i <= n; i++) {
f = (f + m) % i;
}
return f + 1;
}
int main() {
int n, m;
printf("请输入人数 n 和出圈间隔 m:");
scanf("%d%d", &n, &m);
int ans = josephus(n, m);
printf("最后剩下的人的编号为:%d\n", ans);
return 0;
}
```
可以看到,C 语言的代码与 Python 代码的结构基本相同,只是语法有所区别。在 C 语言中,需要使用循环来计算最后剩下的人的编号。同时,需要注意整数除法的问题。在 C 语言中,两个整数相除的结果是整数,因此需要将计算过程中的中间结果转换为浮点数,再进行除法运算。
阅读全文