USTCOJ 1366,题见此处:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1366
题目翻译自soj.me,链接地址:http://soj.me/7675
#include <stdio.h>
int increment(int num, int mod)
{
num = (num + 1) % mod;
return num;
}
//每人从碗里取一个石子,返回的i,是拿到碗,且碗中石子为空的人的编号。
int take(char* peo, int bowl, int i, int n)
{
while (bowl--)
{
++peo[i];
i = increment(i, n);
}
return i;
}
main()
{
int n, p;
while (scanf("%d%d", &n, &p), n + p)
{
char peo[60] = {0};
int i, bowl;
i = 0; bowl = p;
while (1)
{
i = take(peo, bowl, i, n);
while (peo[i] == 0) //不断将空碗下传。
i= increment(i, n);
bowl = peo[i]; peo[i] = 0; //将标号为i的人面前的石子放入碗中。
if (bowl == p) //若石子等于p石子数,表明已经完成选举
break;
i = increment(i, n); //选举为完成,继续下一轮,将碗传到下一个人手里
}
printf("%d\n", i);
}
return 0;
}