4.有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的人,用c++实现编写此程序
时间: 2023-12-27 15:43:08 浏览: 69
以下是用 C++ 编写的程序,可以求出最后留下的人原来的编号:
```cpp
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入总人数 n:";
cin >> n;
// 初始化数组,表示第 i 个人是否还在圈子里面
bool *in_circle = new bool[n];
for (int i = 0; i < n; i++) {
in_circle[i] = true;
}
int count = 0; // 报数
int left = n; // 剩下的人数
int index = 0; // 当前报数的人的下标
while (left > 1) {
if (in_circle[index]) { // 如果这个人还在圈子里面
count += 1;
if (count == 3) { // 报到 3 了,这个人要退出圈子
in_circle[index] = false;
count = 0;
left -= 1;
}
}
index = (index + 1) % n; // 移动到下一个人
}
// 找到最后留下的人的编号
int result = -1;
for (int i = 0; i < n; i++) {
if (in_circle[i]) {
result = i + 1; // 编号从 1 开始
break;
}
}
cout << "最后留下的人原来的编号是:" << result << endl;
delete[] in_circle; // 释放数组内存
return 0;
}
```
这个程序中用了一个 bool 类型的数组 `in_circle`,表示第 i 个人是否还在圈子里面。一开始,所有人都在圈子里面。每次循环,我们先判断当前报数的人是否还在圈子里面,如果是,我们就让他报数,如果他报到 3 了,就让他退出圈子,并且剩下的人数减 1。最后,我们遍历一遍 `in_circle` 数组,找到最后留下的人的编号。
这个程序的时间复杂度是 O(n^2),因为每次循环都需要遍历整个圈子。如果想要更快的算法,可以使用链表来模拟这个圈子。
阅读全文