码迷,mamicode.com
首页 > 其他好文 > 详细

约瑟夫环(猴子问题)最快解法

时间:2019-01-28 19:22:50      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:fun   编号   image   info   ret   过程   public   获取   最快   

   “约瑟夫环”是一个数学的应用问题:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。如:n=6,m=3

技术分享图片         ——————>   技术分享图片    ————————>  技术分享图片————————>

 

 

技术分享图片 ————————>  技术分享图片  ————————>   技术分享图片

 

   最后还剩下1号的猴子。

 

  对于这个问题,可以这么分析: 首先第一个出列的肯定是a[1]=n%m(m/n的余数),当第i个猴子出列后,剩下的猴子的编号是i+1,i+2,i+3.......i-1,对猴子重新编号是1,2,3,4,5,6,....n-1,假设某个猴子的新编号是k,

那么它原来的编号就是(i+a[1])%n ,如i=1,(i+3)%6=4,假如知道了这个子问题(n-1个猴子)的解是x,那么原问题(n个猴子)的解便是:(x+m%n)%n=(x+m)%n,我们可以想到这是个递归问题,我们可以从只剩1个猴子开始推导,

一直获取它上一次的编号,直到猴子数量增加到n。

  

 技术分享图片

算法:

public function yuesefu($n, $m)
{
$r = 0;//猴子的原编号(从0开始)
//假如只有两个猴子,那么第m%2个猴子会留下
for ($i = 2; $i <= $n; $i++) {
     //每循环一次,就获取一次原编号
$r = ($r + $m) % $i;
}
return $r + 1;//该剩下的猴子最后的编号
}

 

约瑟夫环(猴子问题)最快解法

标签:fun   编号   image   info   ret   过程   public   获取   最快   

原文地址:https://www.cnblogs.com/aibaofeng/p/10331295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!