n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针一二报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人。试问最后剩下的人的编号。 用C语言作答,不用递归函数
时间: 2024-03-04 22:05:24 浏览: 91
以下是用循环实现的解法,时间复杂度为O(n):
```c
#include <stdio.h>
int main() {
int n; // n个人
int m = 2; // 报数到m的人出圈
scanf("%d", &n);
int i, j, people[n];
for (i = 0; i < n; i++) {
people[i] = i + 1; // 初始化编号
}
i = 0; // 从第一个人开始报数
int count = n; // 圈子里的人数
while (count > 1) { // 只要还有超过1个人在圈子里就继续报数
for (j = 1; j < m; j++) { // 报数到m的人出圈
i++;
if (i == n) { // 如果已经报数到最后一个人,重新从第一个人开始报数
i = 0;
}
while (people[i] == 0) { // 如果这个人已经出圈,继续报数
i++;
if (i == n) {
i = 0;
}
}
}
people[i] = 0; // 标记出圈的人
count--;
i++;
if (i == n) { // 如果已经报数到最后一个人,重新从第一个人开始报数
i = 0;
}
while (people[i] == 0) { // 如果这个人已经出圈,继续报数
i++;
if (i == n) {
i = 0;
}
}
}
for (i = 0; i < n; i++) { // 找到最后一个留在圈子里的人
if (people[i] != 0) {
printf("%d", people[i]);
break;
}
}
return 0;
}
```
阅读全文