1 问题
有30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置?
2 方法
给30个人编号1-30,每个人的初值都是1(在船上),i代表他们的编号,j代表被扔下船的人数(j=15时循环结束),用check记数,check=9时将对应编号i的人置0(扔下船)并让check重新记数。
当i等于31时,手动将i置为1
当对应编号i的人值为0时,代表此人已经不在船上,i+1找到下一个人记数,以此类推。
代码清单 1
people={}
for x in range(1,31):
people[x]=1
check=0
i=1
j=0
while i<=31:
if i == 31:
i=1
elif j == 15:
break
else:
if people[i] == 0:
i+=1
continue
else:
check+=1
if check == 9:
people[i]=0
check = 0
print("{}号下船了".format(i))
j+=1
else:
i+=1
continue
3 结语
针对‘约瑟夫小游戏’问题,提出用for循环的方法,通过运行程序实验,证明该方法是有效的,本文结构性不强,还需不断完善。