目录
约瑟夫小故事:
问题数学化:
特殊情况:
1. q = 2 , n =2^k (k=1 , 2, 3, ...... )
2. q = 2 , n =2^k + t (k=1 , 2, 3, ...... )
一般情况:
思路总结:
算法推导:
代码实现:
总结:
约瑟夫小故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。 于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。
问题数学化:现在有 n 个人,每个人都有属于自己的标识(下标),分别是 0 ~ n-1。所有人呈圆环状排列,每隔 q 个人就淘汰一个人 ,最后只能有一个人留下来,来求这个人的下标。
特殊情况: 1. q = 2 , n = (k=1 , 2, 3, ...... )此时的存活的人总是第一个人!
例如:
注: