有n个人围成一圈,按从1到n顺序编号。然后从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。其中,n的值应从键盘输入。目前,仅编写完成了main函数,请编写其它三个函数:i
时间: 2023-12-23 08:53:17 浏览: 25
1. `initCircle`函数:初始化圆圈,将所有人的状态设置为在圈内。
2. `getNext`函数:获取下一个报数的人的编号。
3. `eliminate`函数:将指定编号的人从圆圈中淘汰。
以下是完整的代码实现:
```c++
#include <iostream>
using namespace std;
const int MAXN = 100;
bool circle[MAXN]; // 圆圈,circle[i]表示第i个人是否在圈内
void initCircle(int n) {
for (int i = 0; i < n; i++) {
circle[i] = true; // 所有人都在圈内
}
}
int getNext(int cur, int n) {
do {
cur = (cur + 1) % n; // 循环获取下一个编号
} while (!circle[cur]); // 直到找到在圈内的人
return cur;
}
void eliminate(int cur) {
circle[cur] = false; // 将该编号的人淘汰
}
int main() {
int n;
cin >> n;
initCircle(n);
int cur = -1; // 当前报数的人的编号
for (int i = 0, cnt = 0; i < n - 1; i++) { // 进行n-1轮淘汰
for (int j = 0; j < 3; j++) { // 报数
cur = getNext(cur, n);
cnt++;
}
eliminate(cur); // 淘汰
cout << "第" << cnt << "个淘汰的人是:" << cur + 1 << endl;
}
for (int i = 0; i < n; i++) { // 找到最后一个在圈内的人
if (circle[i]) {
cout << "最后留下的人是:" << i + 1 << endl;
break;
}
}
return 0;
}
```
需要注意的是,题目中从1到n顺序编号,而数组下标从0开始,因此在代码实现中,需要将编号减1。