天天看点

约瑟夫环,PHP模拟环形链解决方法!

题 :一群猴子排成一圈.按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);
}