N个人围成一圈顺序编号,从1号开始按1、2、3…顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号。
输入格式:
输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。
输出格式:
按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。
输入样例:
7 3
输出样例:
3 6 2 7 5 1 4
#include<iostream>
#include<cstdlib>
using namespace std;
int b[3001];
void huan(int n,int m)
{
int t=0; //计数器
int a=n; //原列剩余人数
int i=0;
int *arr=(int *)malloc(sizeof(int)*n); //动态开辟数组arr[n]
int k=0;
for(i=0;i<n;++i)
{
arr[i]=1; //标记1还在原列,标记0在新列
}
i=0; //目前i到n-1,需重新赋值
while(a>0) //原列还有人
{
if(arr[i]!=0) //前提:原列里的人
{
t++;
if(t==m)
{
a--; //原列-1
arr[i]=0; //标记
t=0; //重新从0开始报数
b[k]=i+1; //录入新列
k++;
}
}
i=(i+1)%n; //循环数组
}
free(arr); //动态最后需释放
}
int main()
{
int n,m;
cin>>n>>m;
huan(n,m);
cout<<b[0];
for(int i=1;i<n;++i){
cout<<" "<<b[i];
}
return 0;
}