注意,N个人围成一圈,中间不断有人出圈,最后的状态是所有人都出圈了,而且当有人出圈时,直接将其进行标记,当下次循环到出圈时直接跳过,相当于一个哨兵,而不是直接将出圈的删掉,因为这样不方便代码。
#include<iostream>
#include <vector>
using namespace std;
int main()
{
int N,M;
cin>>N>>M;
vector<bool> a(N+1,false); //true表示出圈
int t=0,s=0,n=0; //t表示当前人编号 s表示当前多少人报数了 n表示多少人出圈了
while(n!=N) //最后肯定是所有人都出圈了
{
//t=(t++)%N; //循环成圈计数 t可能为0 不可取
t++;
if(t==N+1) t=1; //循环成圈
if(!a[t]) s++; //当未出圈时才计数
if(s==M) //到M出圈
{
a[t]=true; //更改状态为出圈
n++; //出圈人数加一
s=0; //重新计数
cout<<t<<" ";
}
}
return 0;
}