/* 13. 一群猴子排成一圈,按1,2,...,n依次编号。 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去...,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。 要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。 */ // 输入m,n. 本程序用6和4来举个例子 $n = 6; $m = 4; $monkeys = array(); for($i=1; $i<=$n; $i++){ //按1,2,...,n依次编号 $monkeys[] = $i; } echo '<pre>'; echo "start:"; print_r($monkeys); //输出初始状态 $i = 0; //数组下标 $z = 0; //数数的变量 $c = $n; //用来记录还剩下的猴子个数 while($c>1){ //只要剩下的猴子还多余一个,就继续循环 if($i == $n){ $i = 0; //如果下标跑到头,就回0;用这个方法来模拟不停转圈。 } if($monkeys[$i] != null){ //跳过之前已经踢出去的猴子 $z++; // 往下数 if($z == $m){ //如果数到了m $monkeys[$i] = null; //数到第m只,把它踢出圈 $c--; //猴子数量减1 $z = 0; //重新再数 echo "temp:"; print_r($monkeys); //这里去掉注释可以输出中间过程,看清踢出的顺序 } } $i++; //下标往下走 }//while echo "final:"; print_r($monkeys);//打印最后结果 echo '</pre>';