c++用vector实现约瑟夫环并讲解代码
时间: 2024-04-29 13:25:38 浏览: 19
约瑟夫环是一种经典的问题,其描述如下:
有n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人重新排成一圈,继续从第一个人开始报数,报到m的人再次出圈,如此循环,直到所有人都出圈为止。求出出圈的顺序。
这个问题可以用vector来实现。具体思路如下:
首先,我们需要用vector来表示所有人的编号,可以用一个循环将编号从1到n依次添加到vector中。
接着,我们需要用一个循环来模拟报数的过程。在每一轮中,从当前位置开始,依次数m个人,将第m个人从vector中删除,并记录其编号。
当vector中只剩下一个人时,停止循环,输出所有出圈人的编号即可。
下面是完整的代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> nums;
for(int i = 1; i <= n; i++) {
nums.push_back(i);
}
vector<int> out;
int idx = 0;
while(nums.size() > 1) {
idx = (idx + m - 1) % nums.size();
out.push_back(nums[idx]);
nums.erase(nums.begin() + idx);
}
out.push_back(nums[0]);
for(int i = 0; i < out.size(); i++) {
cout << out[i] << " ";
}
cout << endl;
return 0;
}
```
在这个代码中,我们首先使用cin读入n和m,然后创建一个vector nums,并将1到n的编号依次添加到vector中。
接着使用一个while循环模拟报数的过程。在每一轮中,我们使用变量idx记录当前位置,然后依次数m个人,将第m个人从vector中删除,并将其编号添加到另一个vector out中。
当vector nums中只剩下一个人时,停止循环,将最后一个人的编号添加到out中。
最后,我们输出所有出圈人的编号即可。
这个代码使用了vector的erase函数来删除vector中的元素,并使用了取模运算来实现循环计数。