【问题标题】:Coin Change Problem (but with minimum number of coins)硬币找零问题(但硬币数量最少)
【发布时间】:2020-05-09 08:08:40
【问题描述】:

所以我是编码新手,我得到了一项任务,我需要编写一个程序,该程序可以用不到一美元的硬币、一角硬币、五分钱和美分换取零钱。但是,作业希望程序打印所需的最少硬币数量(例如,如果我输入 58 美分,那么输出应该是“2 美分,1 镍和 3 便士”而不是“2 美分,0 角钱,1镍和 3 便士”。本质上,如果没有某种硬币,则程序不应该打印它)。我一直在弄清楚如何制作它,以便程序不会打印任何不必要的硬币。

这是我现在所拥有的:

amount = int(input( "Enter amount (1-99): " ))
twentyfive = amount // 25
ten = amount % 25 // 10
five = amount % 25 % 10 // 5
one = amount % 25 % 10 % 5 //1

print(twentyfive, "quarters", ten, "dimes", five, "nickels", one, "pennies")

【问题讨论】:

  • 动态构建输出字符串。如果特定硬币计数为零,则不要将其包含在输出中。
  • 使用if 语句检查数字是否大于零,然后再决定是否打印。您可以为每个号码编写一个if 语句。
  • @kaya3 当你指的是数字时,你是指用户输入还是硬币?
  • 您要打印的数字。你想打印它们if 它们大于零。
  • @kaya3 好的,谢谢。

标签: python python-3.x


【解决方案1】:

动态构建消息,仅包括计数非零的硬币。

messages = []

if quarters:
    messages.append(f"{quarters} quarters")

if dimes:
    messages.append(f"{dimes} dimes")

if nickels:
    messages.append(f"{nickels} nickels")

if pennies:
    messages.append(f"{pennies} pennies")

# print out all message parts, joined together with commas
print(", ".join(messages))

如果你想在最后一个硬币数量之前显示“and”,你需要更多的逻辑。

【讨论】:

  • 非常感谢您的帮助!出于好奇,我搜索了 f 格式,它说它比 str.format() 快得多。如果 str.format() 代替 f 格式,程序还能运行吗?
  • 您可以使用任何您喜欢的字符串格式化方法。我在回答中使用了 f 字符串,只是因为我认为它们很整洁。
【解决方案2】:

或者使用re:

import re
amount = int(input("Enter amount (1-99): "))
twentyfive = amount // 25
ten = amount % 25 // 10
five = amount % 25 % 10 // 5
one = amount % 25 % 10 % 5 //1
s = f"{twentyfive}, quarters, {ten}, dimes, {five}, nickels, {one}, pennies"
print(re.sub('0, \w+, ', '', s))

输出:

Enter amount (1-99): 58
2, quarters, 1, nickels, 3, pennies

【讨论】:

    【解决方案3】:

    您正在解决打印具有这些要求的列表的问题:

    • 三项以上应以', '分隔
    • 最后一项应在and 前面,如果有超过 1 项的话

    例子:

    • ['1 dime', '2 quarters'] : '1 dime and 2 quarters'
    • ['3 nickels'] : '3 nickels'
    • ['1 dime', '2 quarters', '3 nickels'] : '1 dime, 2 quarters, and 3 nickels'
    def nice_list(items):
        return ', '.join(items[:-1] + [('and ' if len(items) > 1 else '') + items[-1]])
    

    您要解决的另一个问题是您想打印一个带有名词的数字,如果数字不是1,则该名词后跟一个's'。但是,烦人的是,如果名词以'y' 结尾,你想用'ies' 代替它

    例子:

    • '0 dimes'
    • '1 nickel'
    • '5 quarters'
    • '3 pennies'
    def number_noun(number, noun):
        if number == 1 or not noun:
            result = noun
        else:
            result = noun + 's' if noun[-1] != 'y' else noun[:-1] + 'ies'
        return f'{number} {result}'
    

    但你也想避免打印任何你需要的硬币0

    所以:

    amount = int(input( "Enter amount (1-99): " ))
    coins = [
        (amount // 25, 'quarter'), 
        (amount % 25 // 10, 'dime'),
        (amount % 25 % 10 // 5, 'nickel'),
        (amount % 25 % 10 % 5 //1, 'penny')
    ]
    print(nice_list([number_noun(c, name) for c, name in coins]))
    

    如果您像我一样不喜欢硬币的数量现在与硬币的名称在同一个列表中:

    amount = int(input( "Enter amount (1-99): " ))
    coins = [
        amount // 25,
        amount % 25 // 10,
        amount % 25 % 10 // 5,
        amount % 25 % 10 % 5 //1
    ]
    name = ['quarter', 'dime', 'nickel', 'penny']
    print(nice_list([number_noun(c, name) for c, name in zip(coins, names)]))
    

    【讨论】:

      【解决方案4】:

      我认为其他回答者推断出的要求比你的作业可能有更严格的要求。您的示例输出包含逗号和单词“and”,因此他们编写了代码以完全那种格式生成输出。我认为他们使用列表、循环、切片和正则表达式来解决本应属于初学者级别的问题,从而使这个问题变得比需要的更复杂。

      既然你说“我是编码新手,我得到了一个任务”,你的任务似乎不太可能特别要求你必须以如此严格的格式生成输出 - 如果它确实,这应该在问题中提及。根据您对作业的描述,我认为初学者应该写以下内容:

      if twentyfive > 0:
          print(twentyfive, 'quarters')
      
      if ten > 0:
          print(ten, 'dimes')
      
      if five > 0:
          print(five, 'nickels')
      
      if one > 0:
          print(one, 'pennies')
      

      【讨论】:

        猜你喜欢
        • 2019-07-17
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 2012-08-05
        相关资源
        最近更新 更多