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

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)

问题分析与修正

核心问题点

  1. 输出小数:用float(input())读取输入,导致整除运算结果为浮点数,比如45//25=1.0。
  2. 输出顺序错误:未按要求先输出dimes,当前输出顺序是dollars→quarters→dimes→nickels→pennies。
  3. exact_change函数未实现:函数直接返回未定义的变量,完全没处理输入参数user_total,导致单元测试报错。
  4. 多余的dollars处理:题目指定的硬币类型不包含美元,无需处理该部分。
  5. 变量拼写错误:函数内的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}")

修正说明

  1. 整数输入:改用int(input())读取输入,确保所有运算结果为整数,解决小数输出问题。
  2. 实现函数逻辑:exact_change函数内部处理输入的找零金额,计算各硬币数量,并按题目要求的顺序返回结果。
  3. 调整输出顺序:优先输出dimes,再输出其他硬币类型,满足实验要求。
  4. 移除冗余代码:删除无关的dollars处理逻辑,符合题目指定的硬币类型范围。
  5. 统一变量拼写:修正num_nickles为num_nickels,避免变量未定义错误。
  6. 简化输出逻辑:用列表存储硬币信息,循环输出非零数量的硬币,减少重复代码。

内容的提问来源于stack exchange,提问作者dglr007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:05:15