描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0
输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入
6 2 12 4 8 3 0 0
样例输出
5 1 7
#include <iostream> // 引入输入输出流库
#include <queue> // 引入队列库
using namespace std; // 使用标准命名空间
int findMonkeyKing(int n, int m) { // 定义函数findMonkeyKing,接收两个参数n和m
queue<int> monkeys; // 创建一个整数类型的队列monkeys
// 初始化队列,将所有猴子的编号放入队列
for (int i = 1; i <= n; ++i) {
monkeys.push(i); // 将编号为i的猴子加入队列
}
while (monkeys.size() > 1) { // 当队列中还有多于一个猴子时执行循环
for (int i = 1; i < m; ++i) { // 报数m之前的猴子重新排到队尾
monkeys.push(monkeys.front()); // 将队首的猴子加入队列
monkeys.pop(); // 弹出队首的猴子
}
// 报到m的猴子退出圈外
monkeys.pop(); // 弹出队首的猴子
}
// 最后剩下的猴子即为猴王
return monkeys.front(); // 返回队列中唯一的元素,即猴王的编号
}
int main() {
int n, m;
while (cin >> n >> m && (n != 0 || m != 0)) { // 从标准输入读取n和m的值,直到n和m都为0为止
cout << findMonkeyKing(n, m) << endl; // 调用findMonkeyKing函数,并输出结果
}
return 0; // 程序正常结束,返回0
}