约瑟夫环,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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值