一群猴子排成一圈,按1,2,...,n依次编号。

然后从第1只开始数,数到第m只,把它踢出圈,

从它后面再开始数,再数到第m只,在把它踢出去...,

如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。


示意图:

php代码:

$arr = array(1,2,3,4,5,6,7,8,9,10);//示例数组
echo 'The King is :
';
print_r(King($arr,12));

function King($arr,$count){
while(count($arr) != 1){//如果数组只剩一个,就是大王,即结果
$length = count($arr);//统计本次循环数组所剩数目
if($length >= $count){//如果所要压出数组直接可以点出来
$res = array_splice($arr,$count-1,1);//压出数组
}else{
$remainder = $count%$length;//求余数,即为所要压出数组的元素
if($remainder == 0){
$remainder = $length;//如果求余结果为0,即时为本数组最后一个元素
}
$res = array_splice($arr,$remainder-1,1);//压出数组
}
}
return $arr;//返回所求,即大王
}



function killMonkey($monkeys , $m , $current = 0){
$number = count($monkeys);
$num = 1;
if(count($monkeys) == 1){
echo $monkeys[0]."成为猴王了";
return;
}
else{
while($num++ < $m){
$current++ ;
$current = $current%$number;
}
echo $monkeys[$current]."的猴子被踢掉了
";
array_splice($monkeys , $current , 1);
killMonkey($monkeys , $m , $current);
}
}
$monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的编号
$m = 4; //数到第几只猴子被踢出
killMonkey($monkeys , $m);



function king($m, $n) {
for($i = 1;$i < $m + 1;$i++) {
//构建数组
$arr[] = $i;
}
$i = 0;//设置数组指针
while (count($arr) > 1) {
//遍历数组,判断当前猴子是否为出局序号,
//如果是则出局,否则放到数组最后
if (($i + 1) % $n == 0) {
unset($arr[$i]);
} else {
array_push($arr, $arr[$i]);
//本轮非出局猴子放数组尾部
unset($arr[$i]);
//删除
}
$i++;
}
return $arr;
}
var_dump(king(100,5));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.