30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
问题:前半部分都正确的,为啥后面就出错了呢,求高手指教
代码如下:
P = []
for i in range(1, 31):
P.append(i)
c = 1
for j in range(1, 16):
while len(P) == 15:
break
else:
for p in P:
if c == 9:
print("{}号下船了".format(p))
P.remove(p)
print(P)
c = 2
else:
c += 1
Python 约瑟夫生者死者小游戏,
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 一般不建议在遍历列表的同时修改列表,这样会造成遍历错误,除非有十足的把握。看到你在删除列表元素后,将变量 c 赋值为2,用于补偿因为列表长度变化造成的遍历问题,但是忽视了一个小问题,如果删掉的是列表的最后一个元素(游戏第9轮当30号下船的时候),下一次遍历是从列表的头部开始,c应该是1。
所以,在你的代码上修改如下:P = [] for i in range(1, 31): P.append(i) c = 1 for j in range(1, 16): if c==2:c=1 while len(P) == 15: break else: for p in P: if c == 9: print("{}号下船了".format(p)) P.remove(p) print(P) c = 2 else: c += 1
但是这样会存在一个小问题,就是当人数只有2人的时候,会陷入死循环(当然本题不会存在这种情况),最好是想另一个算法来解决这个问题。
我会这样写:n = 30 k = 15 i = 9 people = list(range(1,n+1)) while len(people)>k: j = (i-1)%len(people) print(f'{people[j]}号下船了') people = people[j+1:]+people[:j] print(people)
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 ansys fluent计算闪退
- ¥15 有关wireshark抓包的问题
- ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
- ¥15 向数据表用newid方式插入GUID问题
- ¥15 multisim电路设计
- ¥20 用keil,写代码解决两个问题,用库函数
- ¥50 ID中开关量采样信号通道、以及程序流程的设计
- ¥15 U-Mamba/nnunetv2固定随机数种子
- ¥15 vba使用jmail发送邮件正文里面怎么加图片
- ¥15 vb6.0如何向数据库中添加自动生成的字段数据。