题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。
从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数;
如此重复,直至剩下一个猴子,它就是大王。
实现
<?php
error_reporting(E_ALL);
$N = isset($_GET['n']) ? $_GET['n'] : 0;//猴子总数
$M = isset($_GET['m']) ? $_GET['m'] : 0;//报数number
if(!$N || !$M){
echo "Need Params n & m.";
exit;
}
//猴子排队拿号
$monkey_group = array();
for($i=1;$i<=$N;$i++){
$monkey_group[] = $i;
}
echo "There are ".count($monkey_group)." Monkeys.<br>";
//猴子围坐
$king_num = 0;
$counter = 0;
while(true){
$temp = array();
$L = count($monkey_group);
if($L == 1){
//只剩一个则为King
$king_num = $monkey_group[0];
break;
}
//从1到m报数
for($j=0;$j<$L;$j++){
$counter++;
echo "[".$monkey_group[$j]."] : ".$counter;
if($counter == $M){
//报数为m的出列
echo " out";
unset($monkey_group[$j]);
$counter = 0;
}else{
//其余继续报数
array_push($temp,$monkey_group[$j]);
}
echo "<br>";
}
//新的报数队列
$monkey_group = $temp;
}
echo "The King Is : NO.".$king_num."<br>";
exit;
传入参数: n = 10 & m = 3
页面打印:
There are 10 Monkeys .
[ 1 ] : 1
[ 2 ] : 2
[ 3 ] : 3 out
[ 4 ] : 1
[ 5 ] : 2
[ 6 ] : 3 out
[ 7 ] : 1
[ 8 ] : 2
[ 9 ] : 3 out
[ 10 ] : 1
[ 1 ] : 2
[ 2 ] : 3 out
[ 4 ] : 1
[ 5 ] : 2
[ 7 ] : 3 out
[ 8 ] : 1
[ 10 ] : 2
[ 1 ] : 3 out
[ 4 ] : 1
[ 5 ] : 2
[ 8 ] : 3 out
[ 10 ] : 1
[ 4 ] : 2
[ 5 ] : 3 out
[ 10 ] : 1
[ 4 ] : 2
[ 10 ] : 3 out
The King Is : NO . 4