Python编写ATM最小钞票张数计算程序10、1美元面值计算异常如何解决
问题根源
你现有的代码存在两个核心逻辑错误:
- 所有面值的张数计算都基于原始取款总额,没有扣除已经用更大面值凑出的金额,导致小面值计算重复统计
- 用
%2校验是否使用当前面值的逻辑没有合理性,仅巧合适配了100、50、25面值的部分场景,完全不适用于10、5、1面值的计算
修复方案
要得到最小张数的钞票组合,直接使用贪心算法即可:按面值从大到小的顺序,依次计算当前剩余金额最多可使用的当前面值张数,扣除对应金额后再处理下一个更小的面值即可。
修复后的代码如下:
print("Hi! Welcome to Python Bank. \nHow much would you like to withdraw?") amnt = int(input("Please input amount: ")) # 按面值从大到小排序 denominations = [100, 50, 25, 10, 5, 1] result = [] remain = amnt for d in denominations: count = remain // d if count > 0: # 处理单复数显示 if count == 1: result.append(f"{count} ${d} Bill") else: result.append(f"{count} ${d} Bills") # 扣除已凑的金额 remain = remain % d # 拼接输出 print(", ".join(result))
验证效果
输入258时,程序运行过程:
- 258//100=2张,剩余58
- 58//50=1张,剩余8
- 8//25=0,跳过
- 8//10=0,跳过
- 8//5=1张,剩余3
- 3//1=3张,剩余0
最终输出:2 $100 Bills, 1 $50 Bill, 1 $5 Bill, 3 $1 Bills,完全符合预期。
内容的提问来源于stack exchange,提问作者Michel Hijazin
相关产品推荐
相关产品推荐

