【问题描述】
已知n个人(以编号1,2,3…n分别表示)围坐成一圈。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人将被kill;依此规律重复下去,直到剩下一人。
【分析问题】
- 先用1-n给这n个人进行编号,存储在一个list列表中
- 从的一个人(list头部)开始数数,有数到非m和数到m两种情况
- 数到非m:将这个人加入到list尾部,下一个人报数+1
- 数到m:将这个人杀死(弹出列表),下一个人重新从1开始报数
【代码实现】
def play(man, sep, rest):
"""
Arguments:
man {[int]} -- [初始总人数]
sep {[int]} -- [报数报到sep的人被kill]
rest {[int]} -- [最终的幸存者数]
"""
man = [i for i in range(1, man+1)]
number = 1
while len(man) > rest:
if number == sep:
print("kill", man[0])
man.pop(0)
number = 1
else:
item = man.pop(0)
man.append(item)
number = number + 1
print("The survivors are: ", man)
if __name__ == '__main__':
play(8, 3, 1)
【输出结果】
kill 3
kill 6
kill 1
kill 5
kill 2
kill 8
kill 4
The survivors are: [7]