题目
M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外, 如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。
用数组模拟一个环
以下是网上的提供的方案, 很简单明了
function mk($n ,$m){
$arr = range(1,$n);//构造一个数组
$i = 1; //从第一个开始循环
while(count($arr)>1){ //如果总数大于1
($i % $m != 0) && array_push($arr,$arr[$i-1]);//不被踢出则压入数组尾部
unset($arr[$i-1]);//压入数组然后删除
$i++;//继续循环
}
return $arr[$i-1]; //直至最后剩下一个为大王
}
print_r(mk(6,8)); //第3只为大王
递归报数
自己实现了一个,主要用递归方式实现, 思想上更加贴合题目描述, 就是不断报数
<?php
function dotask($array, $m, $begin){
if(count($array)==1){
return $array;
}
// echo $begin;
// print_r($array);
$i=$begin;
foreach($array as $key=>$a){
if($i==$m){
unset($array[$key]);
$i=0;
}
$i++;
}
$arr = dotask($array, $m, $i);
return $arr;
}
$n = 9;
$array = range(1,$n);//构造一个数组
$arr = dotask($array, 7, 1);
echo '======';
print_r($arr);
?>