[TOC]
## 约瑟夫环
### 题目描述
已知n个人(以编号1,2,3...n分别表示)按既定的方向围坐在一张圆桌周围。从编号为k的人开始按既定方向报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列
* * * * *
### 输入
n, k, m (each in one line)
* * * * *
### 输出
the counting-out sequence, each number in one line
* * * * *
### 代码实现
```
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,k,m,x=0;
vector<int> v;
cin >> n >> k >> m;
for(int i = 1; i <= n; i ++){
v.push_back(i);
}
while(v.size()){
x = (m+x-1)%v.size();
cout << v[x] << endl;
v.erase(v.begin()+x);
}
}
```
### 分析
n表示人数,k表示从第k个人开始报数,m表示数到m出圈。
在这里我们规定n=9,k=1,m=5,即从第一个人开始报数,报数为5的人出圈。
![](http://120.79.49.147:8080/Image/kancloud/pic1.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic1.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic2.png =500x)
绿色表示这一轮出圈的人,灰色表示之前已经出圈了,每轮开始报数从绿色圆圈的下一个开始报。
![](http://120.79.49.147:8080/Image/kancloud/pic3.png =500x)
数字为5的人出圈后,他将不计入计数。
![](http://120.79.49.147:8080/Image/kancloud/pic4.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic5.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic6.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic7.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic8.png =500x)
![](http://120.79.49.147:8080/Image/kancloud/pic9.png =500x)
至此,所有人出圈完毕,程序结束。