问题简介: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