1. 程式人生 > >例題4-3救濟金的發放

例題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;
}