编号为1…N的N个小朋友玩游戏,他们按编号顺时针围成一圈,从第一个人开始按逆时针次序报数,报到第M个人出列;然后再从下个人开始按顺时针次序报数,报到第K个人出列;再从下一个人开始按逆时针次序报数,报到第M个人出列;再从下个人开始按顺时针次序报数,报到第K个人出列……以此类推不断循环,直至最后一人出列。请编写程序按顺序输出出列人的编号。
输入格式:
输入为3个正整数,分别表示N、M、K,均不超过1000。
输出格式:
输出为一行整数,为出列人的编号。每个整数后一个空格。
输入样例:
6 3 5
输出样例:
5 3 1 2 4 6
#include <stdio.h>
int main()
{
int N,M,K,n,i=1,t; //M为逆时针,K为顺时针
scanf("%d %d %d",&N,&M,&K);
int x[N];
for(n=0;n<N;n++) //初始化数组
x[n]=0;
if(N==1)printf("1 ");
else
{
for(n=0;n<N;n++)
{ //通过次数的奇偶确定顺逆方向
if(n%2==0)
{ t=0; //记录报数次数
while(t<M-1)
{
i--;
if(i<0)i=N-1;
if(x[i]==0)t++;
}
x[i]=1;//记录为出列
if(i==0)printf("%d ",N);
else printf("%d ",i);
}
if(n%2==1)
{ t=0;//记录报数次数
while(t<K-1)
{
i++;
if(i>N-1)i=0;
if(x[i]==0)t++;
}
x[i]=1;//记录为出列
if(i==0)printf("%d ",N);
else printf("%d ",i);
}
}
}
}