问题描述:
30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
查看网上的资料都是把人员实例为字典,1代表在船上,0代表下船。网上的实现代码如下:
1 people={} 2 for x in range(1,31): 3 people[x]=1 4 # print(people) 5 check=0 6 i=1 7 j=0 8 while i<=31: 9 if i == 31: 10 i=1 11 elif j == 15: 12 break 13 else: 14 if people[i] == 0: 15 i+=1 16 continue 17 else: 18 check+=1 19 if check == 9: 20 people[i]=0 21 check = 0 22 print("{}号下船了".format(i)) 23 j+=1 24 else: 25 i+=1 26 continue
View Code
重新写了一种以list来实现该功能。代码如下:
1 people = [x for x in range(1, 31)] # 生成人员 2 3 xia = [] # 存放下船人的list 4 j = 0 # 上次顺序下船的余量 5 while True: 6 for i in range(1, len(people)+1): 7 8 if (i+j) % 9 == 0: 9 xia.append(people[i-1]) 10 j = (len(people) + j) % 9 11 print("下船者:", xia) 12 for x in xia: 13 people.remove(x) 14 xia = [] 15 if len(people) <= 15: 16 break
----------------------------------------------------------6.29 更新--------------------------------------------------------------------
发现上面的代码有漏洞,
1、第11行打印下船人数,但是这一步人还没有remove出list,所以这行代码要后置
2、上面的代码考虑不全,容易下船的人多于15个。原因就是第13行在remove的时候没有增加人数的判断(第15~16行的代码)
比如修改为50人,数到的3下船,留20人在船上。用上面的代码跑就会导致船上留的人少于20人
故,修改代码如下:
people = [x for x in range(1, 51)] # 生成人员 xia = [] # 存放下船人的list j = 0 # 上次顺序下船的余量 while True: for i in range(1, len(people)+1): if (i+j) % 3 == 0: xia.append(people[i-1]) j = (len(people) + j) % 3 # 余数需要计入下一次循环 for x in xia: people.remove(x) print("下船者:", x) if len(people) == 20: # 判断到20人的时候终止循环 raise "完成" # 用异常退出2次循环 else: continue xia = []
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 约瑟夫生者小游戏 用list实现 - Python技术站