多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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) 至此,所有人出圈完毕,程序结束。