约瑟夫问题
描述
有 m 个人,其编号分别为 1~m。按顺序围成一个圈,现在给定一个数 n,从第一个人开始依次报数,报到 n 的人出圈,然后再从下一个人开始,继续从 1 开始依次报数,报到 n 的人再出圈,……如此循环,直到最后一个人出圈为止。编程输出所有人出圈的顺序。
输入
一行两个正整数 m 和 n,之间用一个空格隔开,1≤m<100,1≤n≤32767。
输出
输出 m 行,每行一个正整数,表示依次出圈的人的编号。
输入样例 1
8 5
输出样例 1
5 2 8 7 1 4 6 3
#include <iostream>
#include <queue>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
queue<int> circle;
for (int i = 1; i <= m; i++) {
circle.push(i);
}
while (!circle.empty()) {
for (int i = 1; i < n; i++) {
circle.push(circle.front());
circle.pop();
}
cout << circle.front() << endl;
circle.pop();
}
return 0;
}