方法一
function getNum($arr,$num){
$i=1;while(count($arr)>1){
if($i%$num==0) {
unset($arr[$i-1]);
}else{
array_push($arr,$arr[$i-1]);
unset($arr[$i-1]);
}
$i++;
}
return $arr;
}
$count=10;
$num=7;
$arr=range(1,$count);
$result=getNum($arr,$num);
print_r($result);
方法二
function getNum($n,$m){
$r=0;
for ($i=2; $i<=$n ; $i++) {
$r=($r+$m)%$i;
}
return $r+1;
}
print_r(getNum(10,7));
方法三
function
monkeySelectKing(
$n
,
$m
)
{
//猴子的初始数量不能小于2
if
(
$n
<2)
{
return
false;
}
$arr
=range(1,
$n
);
//将猴子分到一个数组里, 数组的值对应猴子的初始编号
$unsetNum
=0;
//定义一个变量,记录猴子的报数
for
(
$i
= 2;
$i
<=
$n
*
$m
;
$i
++)
//总的循环次数不知道怎么计算,
{
//不过因为循环中设置了return,所以$m*$len效率还可以
foreach
(
$arr
as
$k
=>
$v
)
{
$unsetNum
++;
//每到一个猴子, 猴子报数+1
//当猴子的报数等于淘汰的数字时:淘汰猴子(删除数组元素)
//报数归0(下一个猴子从1开始数)
if
(
$unsetNum
==
$m
)
{
// echo "<pre>";//打开注释,可以看到具体的淘汰过程
// print_r($arr);
unset(
$arr
[
$k
]);
//淘汰猴子
$unsetNum
=0;
//报数归零
if
(
count
(
$arr
)==1)
//判断数组的长度, 如果只剩一个猴子, 返回它的值
{
return
reset(
$arr
);
}
}
}
}
}
var_dump(monkeySelectKing(6, 3));