You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:06:25