1.需求---- 经典约瑟夫问题
首先,我们需要知道什么是约瑟夫问题?即设有n个人围成一圈,现从第m个人开始报数,数到第m1人淘汰或者退出,然后从出列的下一个m+1个人重新报数,数到m的人出列..........如此循环,直到所有的人全部出列(延伸直到剩下一个玩家时游戏结束),约瑟夫的问题是:对于任意给定的n,m,k求出按次序得到的出列人序列。
后续根据这个问题进行了拓展,如确定m为1,即从第1个人开始报数,直到剩下一个时游戏结束,这个玩家就是游戏获胜者。在n,k知道的情况下求最后留下的是原来第几号的那位。
需求: 万变不离其宗,后续的变体其实都是在n,m,k基础上进行控制变量的,因此我们可以写一个代码,覆盖这三个变量求解约瑟夫问题,针对m变量是1的情况下也可以覆盖。
2.解题思路分析
为了简化出列的过程: m=1
首先我们把这n个人的序号编号从0~n-1(理由很简单,由于m是可能大于n的,而当m大于等于n时,那么第一个出列的人编号是m%n,而m%n是可能等于0的,这样编号的话能够简化后续出列的过程),当数到m-1的那个人出列,因此我们编号完成之后,开始分析出列的过程:
第一次出列:
一开始的时候,所有人的编号排成序列的模式即为:
0,1,2,3,4,5...n-2,n-1
那么第一次出列的人的编号则是(m-1)%n1,那么在第一个人出列之后,从他的下一个人又开始从0开始报数,为了方便我们设k1 = m%n1(n1为