约瑟夫环问题

约瑟夫环运作如下:
1、一群人围在一起坐成[2]   环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
4、一直循环,直到所有人出列[3]   ,约瑟夫环结束
 
花了一个小时时间,总算明白了,赶紧写下来防止以后又忘了;
这里我们假定从编号1开始报数。首先我们可以确定的是,最后只剩下一个人时,他的编号为1。
我们要做一个递推公式,关于新编号和旧编号的关系。因为最后的情况已经确定,如果能知道该递推公式,
就可以从最后的编号1一直往前推。
 
首先看看旧编号和新编号的关系。
旧编号 (i个人)              新编号(i-1个人)
1                                   1
2                                   2
3                                   3
。。。                       。。。
s-1                                i-1
s                                    --
s+1                                1
s+2                                2
。。。                       。。。
 
假定旧编号为s的人出列,那么旧编号从s+1开始重新编号。
 
可以得到: 旧编号 = (新编号 i-1+s-1)%i +1; (*)
 
式中s未知。但其实对i个人来说,从1开始报数,报到m出列的那个人的编号是可求的;
 
编号 = (报数-1)%i+1;
则 s=(m-1)%i+1;
 
代入式(*)可得:  旧编号  = (新编号 i-1+m-1)%i +1;
 
至此,可以从最后的编号1开始,往前推到初始情况该人的编号。

转载于:https://www.cnblogs.com/CodeCafe/p/7419279.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值