Description:
猴子选大王,办法如下:猴子按1,2…n编号围坐一圈,从第一只开始按1,2,…m报数,报m的退出,从下一只开始,继续循环报数,剩下的最后一只猴子就是大王,编程输出大王的序号。
Input
输入仅一行,输入猴子个数n和报数m。
Output
输出仅一行,输出大王的序号。
Sample Input
10 3
Sample Output
4
我们用如下的代码解决此问题
#include <stdio.h>
int main()
{
int n, m, a[1000] = { 0 }, i, j, e = 0;
//a[i]为存入第i + 1个猴子所报的数, e记入淘汰的猴子的个数;
scanf("%d %d", &n, &m);
for (i = 0, j = 0; i < n; i++, j++)
{
if (a[i] != -1)//继续往后看就明白为什么令a[i] != -1;
a[i] = j + 1;
else
{
j--;
if (i + 1 == n)//判断它是否是最后一只猴子, 如果是, 从头继续! ;
i = -1;
continue;
}
if (a[i] % m == 0)//判断是否报m
{
a[i] = -1;//报m的退出, 即令它报-1, 就是淘汰了它! ;
j = -1;//因为有下一轮循环有j++, 即从下一只开始, 继续循环报数;
e++;
if (e == n - 1)
break;
}
if (i + 1 == n)
i = -1;
}
for (i = 0; i < n; i++)
if (a[i] != -1)
printf("%d\n", i + 1);
return 0;
}
若有更好的方法, 在评论区告诉Me,Thanks!