C++ n个人围成一圈,按1到n的顺序编号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来的第几号。 输入 首先输入两个正整数n和m,n表示n个人围一个圈子(n>=2),m表示从1报数到m的人退出圈子(1=<m)。 输出 最后剩下的人的编号。
时间: 2023-12-03 18:47:10 浏览: 133
这个问题可以使用约瑟夫问题的算法来解决。约瑟夫问题是一个经典的问题,是一个数学的应用问题,具体描述如下:
有一个编号为 1~n 的 n 个人围成一个圆圈。从编号为 1 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下去,直到圆圈中剩余一个人。要求输出这个人的编号。
使用链表或者数组都可以实现,这里给出使用数组的实现方式:
```c++
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[n]; // 定义数组,存储每个人是否出圈
for (int i = 0; i < n; i++) {
a[i] = 1; // 初始化,每个人都在圈内
}
int count = 0; // 记录报数
int index = 0; // 记录当前位置
int left = n; // 记录还剩下的人数
while (left > 1) { // 当还剩下一个人时结束循环
if (a[index] == 1) { // 如果当前人还在圈内
count++; // 报数
if (count == m) { // 报到 m 了
a[index] = 0; // 标记为出圈
count = 0; // 重新开始报数
left--; // 剩下的人数减一
}
}
index++; // 下一个人
if (index == n) { // 如果到了最后一个人,从头开始
index = 0;
}
}
for (int i = 0; i < n; i++) { // 找出最后留下的那个人
if (a[i] == 1) {
cout << i + 1 << endl;
break;
}
}
return 0;
}
```
输入样例:
```
5 3
```
输出样例:
```
4
```
阅读全文