有n个人围成一圈,顺序排号。从第一人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 程序的运行示例如下: 请输入人数:30 30个人中最后留下的是第29号。 输入提示:"请输入人数:" 输入格式:"%d" 输出提示: "%d个人中最后留下的是第%d号。"
时间: 2024-02-09 18:09:47 浏览: 65
好的,这是一个经典的约瑟夫环问题,下面是一个简单的 C++ 程序实现:
```c++
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入人数:";
cin >> n;
int a[n]; // 使用数组模拟圆圈
for (int i = 0; i < n; i++) {
a[i] = i + 1; // 初始化
}
int p = 0; // 当前报数的人在数组中的下标
int count = 0; // 当前报数的数字
int left = n; // 剩余的人数
// 开始报数和淘汰
while (left > 1) {
if (a[p] != 0) { // 如果这个人还在圈子里
count++; // 报数加1
if (count == 3) {
a[p] = 0; // 淘汰
count = 0; // 重置报数
left--; // 剩余人数减1
}
}
p++; // 下一个人
if (p == n) { // 如果到了最后一个人,从头开始
p = 0;
}
}
// 输出最后留下的人的编号
for (int i = 0; i < n; i++) {
if (a[i] != 0) {
cout << n << "个人中最后留下的是第" << a[i] << "号。" << endl;
break;
}
}
return 0;
}
```
输出结果:
```
请输入人数:30
30个人中最后留下的是第29号。
```
阅读全文