救济金发布问题(C语言实现 Uva 133)
关于p1赋初值为n。逆时针计数,是从1开始,输入为n,然后在自定义函数中变成(n+1+n-1)%n+1=1。
1本身被数一次。
同理关于p2赋初值为1。
#include<stdio.h>
#define maxn 25
int n,k,m,a[maxn];
int go(int p,int d,int t)//起点,方向,步数
{
while(t--)
{
do{p=(p+d+n-1)%n+1;}while(a[p]==0);//跳过为0的数字,走到非0数
}
return p;
}
int main()
{
int i;
while(scanf("%d%d%d",&n,&k,&m))
{
for(i=1;i<=n;i++) a[i]=i;
int left=n;//剩下人数
int p1=n,p2=1;
while(left)
{
p1=go(p1, 1,k);//逆时针计数
p2=go(p2,-1,m);
printf("%3d",p1);
left--;
if(p2!=p1)
{
printf("%3d",p2);
left--;
}
a[p1]=a[p2]=0;
if(left) printf(",");
}
printf("\n");
}
}