约瑟夫问题
题目描述
N
个人围成一圈,从第一个人开始报数,数到M
的人出圈;
再由下一个人开始报数,数到M
的人出圈······输出依次出圈的人的编号。
解题思路
- 用一个数组来模拟N个人围成的圈,并赋值成
0
(0->还没出圈,1->已经出圈)。 - 如果出圈人数 < N,就继续循环。
- 如果当前报的数 < M,就继续内层循环。
- if 还没出圈{
num++
if num加到了m{
arr[i]出圈
output i
has_been_out++
}
}
i自增
AC代码
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[n + 10]{};
int k;
int i = 1;
int out = 0;
while (out < n) {
k = 0;
while (k < m) {
if (a[i] == 0) {
k++;
if (k == m) {
a[i] = 1;
cout << i << " ";
out++;
}
}
i++;
i = (i - 1) % n + 1;
}
}
return 0;
}