C语言简单的方法实现:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
时间: 2023-12-23 14:53:07 浏览: 49
这道题可以使用数组来模拟围成一圈的人,然后模拟报数和退出的过程,直到只剩下一人为止。
以下是C语言的实现代码:
```
#include <stdio.h>
int main() {
int n, i, k, m, a[100] = {0};
scanf("%d", &n);
m = 0; // m表示报数的人数
k = 0; // k表示退出的人数
i = -1; // i表示当前的人数
while (k < n - 1) { // 只要还有不止一人就继续循环
i++; // i表示当前的人数,每次循环加1
if (i == n) i = 0; // 如果i等于n了,就从头开始
if (a[i] == 1) continue; // 如果这个人已经退出了,就跳过
m++; // 报数加1
if (m == 3) { // 如果报数达到3了
a[i] = 1; // 标记这个人已经退出
k++; // 退出的人数加1
m = 0; // 重新开始报数
}
}
for (i = 0; i < n; i++) {
if (a[i] == 0) { // 找到最后留下的人
printf("%d\n", i + 1); // 输出这个人的编号
break;
}
}
return 0;
}
```
这段代码的思路是,首先读入人数n,然后初始化变量m、k和i。接着进入while循环,只要退出的人数小于n-1(也就是还没剩下最后一人),就一直循环下去。
在循环中,首先将i加1,表示当前报数的人数。如果i等于n了,就从头开始。如果这个人已经退出了,就跳过。如果报数达到3了,就标记这个人已经退出,并且退出的人数加1,然后重新开始报数。
最后在循环外找到最后留下的人,输出它的编号即可。