有30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置?
循环报数(遍历到最后一个再重新开始一次遍历)&直到下船人数达到15人为止(主要循环)
判断遍历的人是否还在船上,如果在,则报数;否则跳过本次循环,遍历下一个人。
报数,如果报数到9,那个人就要下船,计数器返回到1,并且下一次遍历时就不考虑他。未到9,计数器+1,遍历下一个人。
people={} #创建空字典
for x in range(1,31): #通过遍历装载KEY,并将所有的VALUE赋值为1
people[x]=1
check=0 #报数变量
i=1 #KEY循环变量
j=0 #下船计数
while i<=31: #定义循环区间
if i == 31: #当i累加到31,即循环重新开始,重置该变量为1
i=1
elif j == 15: #当下船人数累加到15人,终止
break
else:
if people[i] == 0: #KEY对应的值为0,即已下船,计数并继续下一循环
i+=1
continue
else: #在未下船的人员中判断
check+=1 #报数开始并累加
if check == 9: #当第9个出现
people[i]=0 #将对应KEY的VALUE赋值为0
check = 0 #重置报数
print("{}号被扔下船了".format(i))
j+=1 #下船计数
else: #下船计数不为9时计数并继续循环判断
i+=1
continue
运行结果:
方法二:
lst = list(range(1,31)) #创建30人的列表
j=1 #报数,从1-9循环
k=0 #被丢下的人的号数,从1-30循环,如果一轮报完人数还是大于15人,号数归零进行第二轮
while True:
if len(lst) > 15: #如果人数大于15人,进行下面判断
if j == 9: #如果报到9 ,则从队伍(列表)中移除,被扔下船
print('{:<2d}号被抛下船了'.format(lst[k]))
lst.remove(lst[k])
j = 1 #后面一位从1开始重新报
else: #如果没有报到9,继续报
j += 1
k += 1
if len(lst) == k: #如果一轮报完人数还是大于15人,号数归零进行第二轮
k = 0
else: #如果人数小于等于15人,游戏结束
break
运行结果:
python培训:http://www.baizhiedu.com/python2019