CS50自动售货机Python代码输入小于50值时无限循环问题咨询
问题原因
代码陷入死循环的核心原因是未对用户累计投币金额做持久化记录,每次循环都直接用固定应付额50减去当次输入的单枚硬币值计算剩余待付金额:
例如第一次输入10,代码算出待付40;第二次再输入10,代码依然用50减10算出待付40,剩余待付金额永远不可能降到0,自然触发不了退出循环的
break逻辑。
除此之外原代码还存在几个明显问题:
- 定义的
run = True变量全程未被调用,属于冗余无效代码 - 未做投币面额校验,不符合CS50该作业仅接受5、10、25三种面额硬币的要求
- 找零计算逻辑错误,未考虑历史投币金额,仅用当次投币额减50计算找零,结果完全不准
修复代码
修复后逻辑为:初始化累计已投金额变量,每次投币先校验面额合法性,合法则累加已投额,再判断是否付够金额,对应输出剩余待付或找零,付够后退出循环:
amount_due = 50 accepted_coin = [5, 10, 25] total_paid = 0 print(f"amount due: {amount_due}") while True: coin = int(input("Insert coin: ")) # 不支持的面额直接跳过,提示剩余待付 if coin not in accepted_coin: print(f"amount due: {amount_due - total_paid}") continue # 累加有效投币 total_paid += coin # 未付够则输出剩余待付 if total_paid < amount_due: print(f"amount due: {amount_due - total_paid}") # 付够则计算找零,退出循环 else: change = total_paid - amount_due print(f"change owed: {change}") break
修复逻辑说明
- 新增
total_paid变量持久化记录用户所有有效投币的总额,从根源解决每次循环重置待付金额的问题 - 新增面额校验逻辑,不符合要求的投币不计入总额,符合题目规则
- 找零计算基于累计投币额,无论用户分多少次投币、单次投币是否超过50,计算结果都准确
- 删除无用的
run变量,精简代码
内容的提问来源于stack exchange,提问作者NYT_ SKY
相关产品推荐
相关产品推荐

