题 :一群猴子排成一圈.按1,2,...,n依次排号.然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数.再数到第m只,把它踢出去..如此不停的进行下去.直到最后只剩下一只猴子为止,那只猴子就叫大王. 要求编程模拟此过程,输入m,n. 输出最后那个大王的编号.
/*
* @param $n 总数
* @param $m 当报数到 m 时,m出列
* @return 最后剩下的数字
*/
function yuesefu($n,$m)
{
$r = 0;
for ($i = 2; $i <= $n; $i++)
{
$r = ($r + $m) % $i;
}
return $r + 1;
}
echo yuesefu(10,3); // 4
?>
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
详细参见 : http://baike.baidu.com/link?url=G8XBrZi3WsBjrmFnguaZ-T2sbUYqOvCks5hujRG4Se9HWZVEtMYCHT4-IasR01ss
我没有高等数学底子,上面的代码我很难理解.
下面是比较好理解的写法, 我自己写的哦!
模拟环形链表做的.
function monkey($num, $key)
{
$monkey = array_keys(array_fill(1, $num,0));
for ($key--, $x = 0, $i = 0, $d = 0; $num != 1; $i++, $x++)
{
if ($x == $num)
{
$monkey = array_values($monkey);
$num -= $d;
$x = $d = 0;
}
if ($i == $key)
{
unset($monkey[$x]);
$i = -1;
$d++;
}
}
return end($monkey);
}