n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上)。接下来被官员选中的人(1个或者2个)离开队伍。
输入n,k,m输出每轮里被选中的人的编号(如果有两个人,先输出被A选中的)。例如,n=10,k=4,m=3,输出为4 8, 9 5, 3 1, 2 6, 10, 7。注意:输出的每个数应当恰好占3列。
#include"stdio.h"
#define max 20
int n,k,m;
int a[max];
int count1=0,count2=0;
int chu1(int a[],int t) //形参为传入数组a[]及点到的人数t
{
int i=1;
while(i<=t){
++count1; //逆时针正数
if(count1==n+1){
count1=1;
}
while(a[count1]==0){ //数过的人就跳过去
++count1;
if(count1==n+1){ //数到最后,返回1重新数
count1=1;
}
}
++i;
}
return a[count1];
}
int chu2(int a[],int t)
{
int i=1;
while(i<=t){
-- count2;
if(count2==0)
{
count2=n;
}
while(a[count2]==0)
{
-- count2;
if(count2==0)
{
count2=n;
}
}
++ i;
}
return a[count2];
}
int main()
{
int i;
int p,q;
scanf("%d%d%d",&n,&k,&m); //n 人数 k 逆时针数k人 m顺时针数 m人
for(i=1;i<=n;++i) //排序
{
a[i]=i;
}
int left = n;
count2=n+1;
while(left) //查找left人
{
p=chu1(a,k);
q=chu2(a,m);
printf("%3d,",p);--left;
if(q!=p)
{
printf("%3d,",q);
-- left;
}
a[p]=a[q] = 0;
}
printf("\n");
}