约瑟夫环问题

        1、什么是约瑟夫环问题呢?

        

        讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。
        于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。

        规则如下:

  • 所有人围成一圈
  • 顺时针报数,每次报到m的人将被排除掉
  • 被排除掉的人将从房间内被移走
  • 然后从被kill掉的下一个人重新报数,继续报m,再清除,直到剩余一人

        即:一共有n个人站成一圈,下标分别为 0 ~ n-1,按m来报数,1 2 .。。 m,报到m的人kill掉,最后只能有一个人活下来(n > = 3,m>=1。我们的问题就是求最后这个人,即求出他的下标

        首先有两种特例:

        1、1 当m = 1

        当m等于1时,我们知道每次第一个人都会kill掉,那么最后就是剩下最后一个人。

        1、2当 m = 2

        1、2、1  n = 2^k,k!=0

        假设 n = 2 ^ k,即n为2的次方数。

        若 n = 2,则下标为:0   1,那么最后就剩下第一个人,下标为0

        若 n = 4,则下标为:0    1    2   3,先kill1  3,剩 0  2,kill 2,剩第一个人下标为0

        .....同理,我们得知,若m == 2,n ==2 ^ k,时,每轮kill都是

你可能感兴趣的:(链表OJ题,开发语言,C++,C语言)