前言
看了好多博客抄来抄去,没有一个把事情说清楚的。当然也可能是我蠢看不懂人家高深的论述...
最终找到一篇我能看懂的帖子,现在用我的思路复述一遍...
如果你看我的帖子看不明白,可以选择移步原帖 地址:https://www.cnblogs.com/cmmdc/p/7216726.html
我相信这篇你一定能看懂,拿上纸笔跟我一起推公式,废话不多说...
什么是约瑟夫环问题
现在有n个人,从1编号至n。编号为1的人开始报数,当报到key时,报数为key的人出局。从key+1个人的位置继续从1开始报数。一直循环。试问最后一个出局人的人是谁?
干货! 干货! 干货!
我们把这n个人从0开始编号。这样做是因为key是有可能大于n的,所以出局的人编号应该是key%n,显然key也可能等于n,这就导致key%n=0 所以为了描述方便,我们从0开始编号,所以对我们来说 数到key-1的那个人出列。
所以现在这些人的顺序是 0 1 2 ... n-2 n-1
显然出局人的序号将是(key-1)%n。那么下一次报0的人在原序列中的序号就将是 key%n,记为k1
我们重新进行排列,将k1作为第一个人, 剩下的n-1个人将得到如下序列
k1, k1+1, k1+2, ... , 0, 1, 2 ... k1-3, k1-2 (k1-1已经出局了&#