猴子选大王游戏 (约瑟夫环)
一群猴子排成一圈.按1,2,...,n依次排号.
然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数.
再数到第m只,把它踢出去..如此不停的进行下去.
直到最后只剩下一只猴子为止,那只猴子就叫大王.
这是约瑟夫环的另一种算法.(某位高人给出的)
一群猴子排成一圈.按1,2,...,n依次排号.
然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数.
再数到第m只,把它踢出去..如此不停的进行下去.
直到最后只剩下一只猴子为止,那只猴子就叫大王.
要求编程模拟此过程,输入m,n. 输出最后那个大王的编号.
function monkeyKing($n, $m) {
$monkeys = range(1, $n);
$i = 0; // 取出时候的坐标
$z = 0; // 数到M的时候停
while(($mNum = count($monkeys)) > 1) {
if($i == $mNum) {
$i = 0; // 圈
}
$z++;
$i++;
if($z == $m) {
array_splice($monkeys, --$i, 1);
$z = 0; // 归零
}
}
return($monkeys[0]);
}
echo 'King is:'.monkeyKing(20, 4);
这是约瑟夫环的另一种算法.(某位高人给出的)
function yuesefu($n,$m) {
$r=0;
for($i=2; $i<=$n; $i++) {
$r=($r+$m)%$i;
}
return $r+1;
}