题目:约瑟夫生者死者小游戏
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
解题思路:
网上搜到的教程多为字典法,这里是使用列表的方法提供一种思路,以供参考。
1、生成1-30的列表ls,用来表示30个人的序号
2、分割列表ls为ls1,ls2。ls1为前9个数字,ls2为后面的数字。
3、输出ls1的最后一个数字,然后删除,把新的ls1附加到ls2之后,形成新的ls列表
4、如此循环15次
具体代码如下:
ls=[x for x in range(1,31)]#生成序号列表
for i in range(15):#循环15次
#列表分为两组,ls1列表为前9个数字
ls1=ls[:9]
ls2=ls[9:]
print('%2d号下船了'%ls1[-1])#输出下船序号
del ls1[-1]#删除列表1中的最后一个数字
ls2.extend(ls1)#删除下船序号后的列表1附加到ls2
ls=ls2#新生成的ls2赋值给ls,表示船上人数已经更新,重新进入循环
利用以上代码定义一个函数,使其更具有普适性,具体如下
def yuesefu():
n=eval(input('船上总人数'))
m=eval(input('下船序号'))
p=eval(input('需下船总人数'))
ls=[x for x in range(1,n+1)]
for i in range(p):
ls1=ls[:m]
ls2=ls[m:]
print('%2d号下船了'%ls1[-1])
del ls1[-1]
ls2.extend(ls1)
ls=ls2
if __name__=='__main__':
yuesefu()