例題4-3救濟金的發放
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;
}