Python精确找零函数问题求助:输出小数与硬币顺序错误等
编程问题求助
我是编程新手,不清楚为何我的答案输出为小数形式,而且实验要求先列出dimes(十分币),不知道哪里出错了,恳请帮助!
题目要求
定义一个名为exact_change的函数,接收以美分为单位的总找零金额,使用最少硬币计算找零,硬币类型包括pennies(1分币)、nickels(5分币)、dimes(10分币)、quarters(25分币)。编写主程序读取整数输入的总找零金额,调用exact_change()并按每行一种硬币类型输出找零,根据数量使用单数或复数名称(如1 penny、2 pennies),输入为0或负数时输出"no change"。程序必须定义并调用exact_change()函数,该函数需返回num_pennies、num_nickels、num_dimes、num_quarters。
我的代码
def exact_change(user_total): return(num_dollars, num_quarters, num_dimes, num_nickles, num_pennies) if __name__ == '__main__': input_val = float(input()) num_dollars = input_val // 100 rem=input_val % 100 num_quarters = rem // 25 rem = rem % 25 num_dimes = rem // 10 rem = rem % 10 num_nickles = rem // 5 rem = rem % 5 num_pennies = rem if input_val <= 0: print("no change") else: num_dollars = input_val // 100 conv_dollar = str(num_dollars) rem = input_val % 100 if num_dollars == 1: print(conv_dollar + ' dollar') elif num_dollars > 1: print(conv_dollar + ' dollars') num_quarters = rem // 25 conv_quarter = str(num_quarters) rem = rem % 25 if num_quarters == 1: print(conv_quarter + ' quarter') elif num_quarters > 1: print(conv_quarter + ' quarters') num_dimes = rem // 10 conv_dime = str(num_dimes) rem = rem % 10 if num_dimes == 1: print(conv_dime + ' dime') elif num_dimes > 1: print(conv_dime + ' dimes') num_nickels = rem // 5 conv_nickel = str(num_nickels) rem = rem % 5 if num_nickels == 1: print(conv_nickel + ' nickel') elif num_nickels > 1: print(conv_nickel + ' nickels') num_pennies = rem conv_penny = str(num_pennies) rem = rem % 1 if num_pennies == 1: print(conv_penny + ' penny') elif num_pennies > 1: print(conv_penny + ' pennies')
测试错误情况
- 输入45时,输出为1.0 quarter、2.0 dimes,预期输出为2 dimes、1 quarter(得分0/1)
- 输入0时,输出"no change"(得分1/1)
- 输入156时,输出为1.0 dollar、2.0 quarters、1.0 nickel、1.0 penny,预期输出为1 penny、1 nickel、6 quarters(得分0/2)
- 单元测试
exact_change(300)应返回0,0,0,12,报错NameError: name 'input_val' is not defined(得分0/3) - 单元测试
exact_change(141)应返回1,1,1,5,报错NameError: name 'input_val' is not defined(得分0/3)
问题分析与修正
核心问题点
- 输出小数:用
float(input())读取输入,导致整除运算结果为浮点数,比如45//25=1.0。 - 输出顺序错误:未按要求先输出dimes,当前输出顺序是dollars→quarters→dimes→nickels→pennies。
exact_change函数未实现:函数直接返回未定义的变量,完全没处理输入参数user_total,导致单元测试报错。- 多余的dollars处理:题目指定的硬币类型不包含美元,无需处理该部分。
- 变量拼写错误:函数内的
num_nickles拼写错误,应改为num_nickels,与主程序变量名统一。
修正后的代码
def exact_change(user_total): # 计算各硬币数量(最少硬币逻辑:从大面值到小面值) num_quarters = user_total // 25 remaining = user_total % 25 num_dimes = remaining // 10 remaining = remaining % 10 num_nickels = remaining // 5 num_pennies = remaining % 5 # 按题目要求返回顺序:num_pennies, num_nickels, num_dimes, num_quarters return num_pennies, num_nickels, num_dimes, num_quarters if __name__ == '__main__': # 读取整数输入,避免浮点数问题 input_val = int(input()) if input_val <= 0: print("no change") else: # 调用函数获取硬币数量 pennies, nickels, dimes, quarters = exact_change(input_val) # 按要求先输出dimes,再依次输出quarters、nickels、pennies(匹配测试用例1预期) coin_list = [ (dimes, 'dime', 'dimes'), (quarters, 'quarter', 'quarters'), (nickels, 'nickel', 'nickels'), (pennies, 'penny', 'pennies') ] # 循环输出非零数量的硬币 for count, singular, plural in coin_list: if count == 1: print(f"{count} {singular}") elif count > 1: print(f"{count} {plural}")
修正说明
- 整数输入:改用
int(input())读取输入,确保所有运算结果为整数,解决小数输出问题。 - 实现函数逻辑:
exact_change函数内部处理输入的找零金额,计算各硬币数量,并按题目要求的顺序返回结果。 - 调整输出顺序:优先输出dimes,再输出其他硬币类型,满足实验要求。
- 移除冗余代码:删除无关的dollars处理逻辑,符合题目指定的硬币类型范围。
- 统一变量拼写:修正
num_nickles为num_nickels,避免变量未定义错误。 - 简化输出逻辑:用列表存储硬币信息,循环输出非零数量的硬币,减少重复代码。
内容的提问来源于stack exchange,提问作者dglr007
相关产品推荐
相关产品推荐

