题目要求:
输入、输出样例:
源代码:
#include<iostream>
#include<queue>
#include<vector>
using namespace std;//例题5.2 约瑟夫问题No.2
int main()
{int n, p, m;while (cin >> n >> p >> m) {//如果输入的是3个0,直接结束循环if (n == 0 && p == 0 && m == 0) {break;}//定义一个队列,用于存放n个小孩的编号queue<int> myQueue;//由于是从编号为p的小孩开始,直接按照 p,p+1,...n,1,2,...,p-1的顺序存入队列中for (int i = p; i <= n; i++) { // 存储p,p+1,...n的编号myQueue.push(i);}for (int i = 1; i < p; i++) { // 存储1,2,...,p-1的编号myQueue.push(i);}//定义一个vector,由于vector不会自动阿皮序,可以用于保存永久出队的元素的先后顺序,就是小孩从圈中出队的顺序vector<int> nums;//开始循环,只要队列不为空,说明小孩还没有全部出队,那就继续遍历while (!myQueue.empty()) {//由于报数是从1开始的,这里的i初始化为1,便于后续判断是否为4的整数倍//for循环的结束条件为nums中元素个数为小孩的总个数,说明此时小孩已经全部出队for (int i = 1; nums.size() < n; i++) {//当i为m的整数倍时,说明此时队头数字代表的小孩报数为m,直接出队,并且保存该数字到nums中//注意,要先保存到nums中,再出队if (i % m == 0) {nums.push_back(myQueue.front());myQueue.pop();}//当i不为m的整数倍时,说明此时队头数字代表的小孩报数不是m,直接放入队尾,出队,让下一个元素于队头else {myQueue.push(myQueue.front());myQueue.pop();}}}//由于输出用英文逗号隔开,且最后一个元素后面不需要逗号,那就先输出出最后的一个元素和逗号,再输出最后的元素for (int i = 0; i < nums.size()-1; i++) {cout << nums[i] << ",";}cout << nums[nums.size() - 1] << endl;}return 0;
}
运行结果: