【题目描述】
N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。
【输入】
输入N和M。
【输出】
输出一行,依次出圈的人的编号。
【输入样例】
8 5
【输出样例】
5 2 8 7 1 4 6 3
【提示】
【数据范围】对于所有数据,2≤N,M≤1000。
【解题代码】
代码如下
。
#include <iostream>
#include <vector>
void josephus(int N, int M) {
std::vector<int> people(N);
for (int i = 0; i < N; i++) {
people[i] = i +1; // 初始化编号
}
int current = 0; // 当前报数的人的索引
while (N > 0) {
current = (current + M -1) % N; // 计算当前报数的人的索引
std::cout << people[current] << " ";
people.erase(people.begin() + current); // 从数组中删除出圈的人
N--; // 总人数减一
}
std::cout << std::endl;
}
int main() {
int N, M;
std::cin >> N>> M;
josephus(N, M);
return 0;
}