问题描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
/**
* get_king_monkey 获取猴大王
* @param int $n 猴子数目
* @param int $m 第几只猴子出圈
* @return int 猴大王
*/
function get_king_monkey($n, $m) {
$arr = range(1, $n);
$i = 1;
while (count($arr) > 1) {
// 依次让猴子出圈,判断猴子是否是要出圈的猴子
$monkey = array_shift($arr);
if ($i % $m !== 0) {
// 如果不是出圈,则放回原来的圈里
array_push($arr, $monkey);
}
$i++;
}
return $arr[0];
}
echo get_king_monkey(12, 4);