猴子选大王

猴子选大王

一堆猴子有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);

你可能感兴趣的:(猴子选大王)