有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 条件:N=987654,用c语言编写程序,并注释每一步是怎么做的
时间: 2023-12-27 11:23:25 浏览: 87
以下是C语言程序,注释解释了每一步的逻辑:
```c
#include <stdio.h>
#define N 987654 // 定义N为987654
int main() {
int num[N]; // 定义一个长度为N的数组,用于记录每个人的编号
int i, j, k; // 定义三个计数器变量
int left = N; // 定义剩余人数,初始值为N
// 初始化编号数组
for (i = 0; i < N; i++) {
num[i] = i + 1;
}
// 开始报数和淘汰
for (i = 0, j = 0, k = 0; left > 1; i = (i + 1) % N) {
if (num[i] != 0) { // 判断当前编号是否已经被淘汰
j++; // 计数器加1
if (j == 3) { // 当计数器达到3时,淘汰该编号
num[i] = 0;
j = 0;
left--; // 剩余人数减1
}
}
}
// 输出最后留下的编号
for (i = 0; i < N; i++) {
if (num[i] != 0) {
printf("最后留下的是原来第%d号的那位\n", num[i]);
break;
}
}
return 0;
}
```
程序的核心思路是:用一个长度为N的数组记录每个人的编号,然后循环报数和淘汰,直到只剩下一个人为止。在循环中,使用三个计数器变量i、j、k,其中i表示当前报数的人在数组中的下标,j表示当前报数的次数,k用于控制循环次数。当计数器j达到3时,淘汰该编号,同时将剩余人数减1。最后输出剩余编号不为0的那个人的编号即可。
阅读全文