C++版while的灵活运用(约瑟夫环问题)

问题描述:

{n}(n\le 200)个人围成一圈,顺序编号。从第1个人开始指数(从1-3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。


求解思路:

int m : 记录退出的人数,while循环内的条件(m <  n-1),这样while循环结束就只剩一个

bool vis[n] : 记录1,2,...,n编号的人数是否退圈

int k :记录数数1,2,3

int i : 记录循环读围圈的人的编号


C++代码:

#include<iostream>

#include<vector>

using namespace std;

int main() {

int n, m, k, i;

cin >> n;

vector<bool> vis(n, 0);

m = 0;

i = -1;

k = 0;

while (m < n - 1) {

i++;

if (i > n - 1) {

i = 0;

}

if (vis[i]) continue;

k++;

if (k == 3) {

m++;

k = 0;

vis[i] = 1;

}

}

for (int j = 0; j < vis.size(); j++) {

if (!vis[j])

cout << j + 1 << endl;

}

return 0;

}


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容