约瑟夫(Josephus)问题

问题描述:编号为1,2,...,n的n个人排成圈,从编号为1的人开始,每三个人出局一个,直到剩下最后一个人,问剩下的人的号码是?

分析:
  1)当有人出局之后,可以用给原来的编号赋新值。因此,当到第二轮时,1和2分别变成n+1和n+2,3已经出局,4和5分别变为n+3和n+4,6已经出局,。。。,以此类推;3k+1和3k+2分别变成n+2k+1和n+2k+2。
  2)在上述编号方式下,第k个出局的人的号码一定是3k,所以最后一个出局的人的最终号码为3n。搞清楚了这一点,这个问题就容易解答了。

求解:
  3)如果编号N>;n,则编号为N的人此前一定有另一个编号。我们如何求编号N对应的前一个编号呢?因为N=n+2k+1或N=n+2k+2,因此k=(N-n-1)/2。前面的编号分别为3k+1和3k+2,即有3k+(N-n-2k)=k+N-n,这就求得了编号N对应的前一个编号。


 4)伪码:

                N = 3*n;
 
                while N > n do N = (N-n-1)/2+N-n;
 
                return N;

 

 红色标注地方有些不明白,是否应该分开来讨论一下呢?求高人指导一下...

你可能感兴趣的:(Josephus,约瑟夫)