有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
时间: 2023-12-23 09:24:56 浏览: 93
这是一个经典的约瑟夫问题,可以使用循环链表或者数组模拟。具体思路是,先将n个人的编号存入数组中,然后按照题目要求进行报数和出圈操作,直到只剩下一个人为止。最后返回该人的编号即可。
下面是使用数组模拟的代码实现:
```c
#include <stdio.h>
int josephus(int n) {
int a[n]; // 定义数组
int i, j = 0, count = 0; // j表示当前报数的人的下标,count表示已经出圈的人数
for (i = 0; i < n; i++) {
a[i] = i + 1; // 初始化数组
}
while (count < n - 1) { // 只要还有两个及以上的人在圈内
for (i = 0; i < 3; i++) { // 报数
while (a[j] == 0) { // 如果当前人已经出圈了,就跳过
j = (j + 1) % n; // 循环到下一个人
}
j = (j + 1) % n; // 循环到下一个人
}
j = (j - 1 + n) % n; // 循环到上一个人,因为当前的j指向的是下一个人
a[j] = 0; // 标记当前人出圈
count++; // 出圈人数加1
j = (j + 1) % n; // 循环到下一个人
}
for (i = 0; i < n; i++) { // 找到最后一个留在圈内的人
if (a[i] != 0) {
return a[i];
}
}
return -1; // 出错了
}
int main() {
int n;
printf("输入总人数:\n");
scanf("%d", &n);
printf("最终留下的是%d号\n", josephus(n));
return 0;
}
```
阅读全文