问题简介:n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王.

这里使用一个递推公式:

  • f[i] = 0  i = 1
  • f[i] = (f[i-1] + m) % i   i >= 2

f[i]表示有i只猴子时,每次剔除m只猴子,最后剩下的大王坐标(坐标从0开始),只有1只猴子时,大王坐标为0,依次递推,即可求得有i只猴子时最后的大王坐标

 1 <html>
 2     <body>        
 3         <?php
 4             function monkeyKing($n, $m) {    //$n为猴子总数,$m为剔除猴子步长
 5                 $s = 0;    //$s为大王坐标,只有一只猴子时,大王坐标为0
 6                 for($i = 2; $i <= $n; $i++) {    //依次向后递推,求到共有$n只猴子,剔除步长为$m时的大王坐标
 7                     $s = ($s + $m) % $i;    //大王坐标递推公式
 8                 }
 9                 return $s;
10             }
11             
12             echo monkeyKing(6, 2);
13         ?>
14     </body>
15 </html>

页面输出

4

 

 

 

 

posted on 2012-05-05 00:26  ZimZz  阅读(1898)  评论(0编辑  收藏  举报