这是一道比较经典的面试题。
n个猴子围成一圈 从1开始数,数到编号为m的猴子则剔除,继续从1开始数,依此直至只剩一只猴子即为大王。
这里解法用了数组的一种用法-队列, 从队列前端开始,将每一个猴子取出看是否符合条件,符合m则不再放回,如果不符合则放在队伍末尾。直至只剩一个猴子即为王。
<?php
header('Content-type: text/html; charset=utf-8');
/**
* 选王
*
* @param int $n 猴子总数
* @param int $m 要剔除的编号
* @return int 王的编号
*/
function sel_king($n, $m) {
//生成猴子集合
$monkeys = range(1, $n);
//计数器
$i = 0;
//循环 直至只剩一个猴子即为王
while( count($monkeys) > 1) {
$i++;
//取出队列第一个猴子
$out = array_shift($monkeys);
//判断该猴子是否编号m
if( 0 != $i % $m ) {
//如果不为m放入队列尾部,是即剔除不需放回
array_push($monkeys, $out);
}
//一次判断结束
}
//返回王的编号
return $monkeys[0];
}
echo sel_king(6,3);
这样的思路还是比较清晰易懂的,当然这个问题的解法有很多,比如下面这个
function yuesefu($n,$m) {
$r=0;
for($i=2; $i<=$n; $i++) {
$r=($r+$m)%$i;
}
return $r+1;
}
print_r(yuesefu(3,3));
此方法利用了数学方面的知识来完成,还是很简便的。可以google一下约瑟夫环 数学方法