猴子选大王
一堆猴子有60只,都有编号,编号是1,2,3 ...60 ,这群猴子60只按照1-60的顺序围坐一圈,从第1开始数,每数到第13个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。请输出王猴的编号。
最简单的动态数组法:
ArrayList h = new ArrayList();
for (int n = 1; n <= 60; n++)
{
h.Add(n);
}
int now = 12;//现在位子
for(int i=1;i<60;i++)
{
h.RemoveAt(now);
now = (now + 12) % (h.Count);
}
Console.WriteLine(h[0]);
纯数组法:
//定义猴子数组
bool[] hz = new bool[60];
int n = 0;//现在位置
int i = 60;//剩下的猴子
int z = 0;//数猴子
while (i > 1)
{
if (hz[n % 60] == false) z++;
if (z == 13)
{
hz[n % 60] = true;//将排除的猴子计为真
z = 0;
i--;
}
n++;//开始数
}
for (int j = 0; j < 60; j++)
{
if (hz[j] == false)
Console.WriteLine(++j);//输出大王
}
减小范围版,先缩小范围,在2个里面选,然后3、4、5······对此算法作者膜拜。
int k = 0;
for (int i = 2; i <= 60; i++)
{
k = (k + 13) % i;
}
Console.WriteLine(++k);