一群猴子排成一圈,按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));
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/articles/8681509.html