N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人从1开始报数,数到M的人出圈;......如此类推,输出依次出圈的人的编号。(m<=n<=100) Input 一行两个数,n和m,分别用空格隔开。 Output 一行n个数,表示出圈的人的编号,用空格隔开 Sample Input 10 3 Sample Output 3 6 9 2 7 1 8 5 10 4 c++代码
时间: 2024-04-14 11:30:52 浏览: 30
以下是解决该问题的C++代码:
```cpp
#include <iostream>
#include <vector>
std::vector<int> josephus(int n, int m) {
std::vector<int> result;
std::vector<int> people(n);
// 初始化人员编号
for (int i = 0; i < n; i++) {
people[i] = i + 1;
}
int index = 0;
while (!people.empty()) {
// 计算报数的位置
index = (index + m - 1) % people.size();
result.push_back(people[index]);
people.erase(people.begin() + index);
}
return result;
}
int main() {
int n, m;
std::cin >> n >> m;
std::vector<int> result = josephus(n, m);
// 输出出圈的人的编号
for (int i : result) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
```
该代码使用了一个向量`people`来表示围成一圈的人员编号。在每次报数时,根据计算得到的索引位置,将对应的人员从向量中移除,并将其编号添加到结果向量`result`中。最后,输出结果向量即可。
请注意,该示例只是一种解决方案,并未对输入进行错误处理。在实际使用中,可能需要根据需求进行适当的修改和改进。