思路:一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。
<?php
//(约瑟夫环)猴子选大王
// 思路:一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。
function king($n,$m){
$mokey = range(1, $n); // 创建一个包含从1到$n之间的元素范围的数组
$i = 0;
while (count($mokey) >1) {
$i += 1;
$head = array_shift($mokey); // 一个个出列最前面的猴子
if ($i % $m !=0) {
// 如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
array_push($mokey, $head);
}
}
return $mokey[0];
}
// 测试
echo king(10,7);