第一种解法:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
bool out[105];//0表示未出圈,1表示出圈
int main(){
scanf("%d %d",&n,&m);
int cnt=0;
int now=0;//当前谁在报数
int r=n;//还剩多少人
while(r!=0){
now++;//开始报数
if(now==n+1) now=1;//如果最后一个人报完数,从1开始
if(out[now]==0){//如果报数的人没有出圈,则报数加一,并且判断是否已经报到m
cnt++;
if(cnt==m){
r--;
cout<<now<<' ';
out[now]=1;
cnt=0;
}
}
}
return 0;
}
第二种队列解法复杂度更低
#include<bits/stdc++.h>
using namespace std;
queue<int> q;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
q.push(i);
}
while(!q.empty()){
for(int i=1;i<m;i++){
q.push(q.front());
q.pop();
}
cout<<q.front()<<" ";
q.pop();
}
return 0;
}