n个人站成一圈,逆时针编号为1到n,有两个官员,A从1开始逆时针发放,B从n开始顺时针发放。在每一轮中,官员A数k个就停下来,官员B数m个就停下来了(有可能两个官员停在同一个人身上)。接下来被官员选中的人离开队伍。
本来逆时针顺时针应该写两个go函数,但是发现可以合并通过取余运算和添加1和-1。
#include<stdio.h>
#include<stdlib.h>
#define max 100
int n , k ,m ,a[max];
int go(int p,int d,int t)
{
while(t--)
{
do{ p = (p+d+n-1)%n +1; }
while(a[p] == 0);//遇到零的时候就退出循环 跳出去了
}
return p;
}
int main()
{
int i ,p1 ,p2 ,left ;
while(scanf("%d%d%d",&n,&k,&m)==3&&n)
{
for(i = 1;i<=n;i++)
a[i] = i;
left = n;//剩下多少人
p1 = n ;
p2 = 1;
while(left)
{
p1 = go(p1,1,k);//顺时针
p2 = go(p2,-1,m);//逆时针
printf("%3d",p1);
left--;
if(p1!=p2)
{
printf("%3d",p2);
left--;
}
a[p1] = a[p2] = 0;//领到救济金的人归为零
if(left)
printf(",");
}
printf("\n");
}
return 0;
}