Python 硬币更换问题(但硬币数量最少)

Python 硬币更换问题(但硬币数量最少),python,python-3.x,Python,Python 3.x,所以我对编码还不熟悉,我得到了一个任务,我需要做一个程序,给硬币、一角硬币、五分硬币和美分中少于一美元的零钱。然而,任务要求程序打印所需硬币的最小数量(例如,如果我输入了58美分,那么输出应该是“2个25美分、1个镍币和3个便士”,而不是“2个25美分、0个10美分、1个镍币和3个便士”。基本上,如果没有某个硬币,那么程序不应该打印它)。我一直在琢磨如何制作它,这样程序就不会打印任何不必要的硬币 这就是我现在所拥有的: amount = int(input( "Enter amount (1-9

所以我对编码还不熟悉,我得到了一个任务,我需要做一个程序,给硬币、一角硬币、五分硬币和美分中少于一美元的零钱。然而,任务要求程序打印所需硬币的最小数量(例如,如果我输入了58美分,那么输出应该是“2个25美分、1个镍币和3个便士”,而不是“2个25美分、0个10美分、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")

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

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))

如果要在最后一个硬币金额之前显示“和”,则需要更多的逻辑。

或使用
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

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

  • 三个以上的项目应以“
    ”和“
  • 如果有多个项目,则最后一个项目前应加上
示例:

  • ['1个一角硬币','2个四分之一']
    '1个一角硬币和2个四分之一硬币'
  • ['3镍币]
    '3镍币'
  • ['1个一角硬币'、'2个二角五分硬币'、'3个五分镍币']
    '1个一角硬币、2个二角五分硬币和3个五分镍币'
您要解决的另一个问题是,如果数字不是
1
,您需要打印一个带有名词的数字,名词后面跟着一个
's'
。但是,令人烦恼的是,如果这个名词以
'y'
结尾,你想用
'ies'替换它

示例:

  • “0个一角硬币”
  • “1镍币”
  • “五个季度”
  • “3便士”
但是你也要避免打印任何你需要的硬币

因此:

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

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)]))

我认为其他回答者推断出的要求比你的任务可能更严格。您的示例输出有逗号和单词“and”,因此它们编写了代码,以完全按照该格式生成输出。我认为他们已经使这个问题变得比需要的更复杂,使用列表、循环、切片和正则表达式来解决初学者级别的问题

既然你说“我对编码不熟悉,而且我有一个任务”,那么你的任务似乎不太可能特别要求你必须以如此严格的格式生成输出——如果是这样的话,这一点应该在问题中提及。根据你对作业的描述,我认为初学者应该写以下内容:

如果二十五>0:
打印(二十五个“四分之一”)
如果10>0:
打印(十个“一角”)
如果五个>0:
印刷品(五个“镍币”)
如果一个>0:
打印(一个“便士”)

动态生成输出字符串。如果特定硬币计数为零,则不要将其包含在输出中。在决定是否打印之前,请使用
If
语句检查数字是否大于零。您可以为每个数字编写一个
if
语句。@kaya3当您指的是数字时,您指的是用户输入的数字还是您要打印的数字。如果它们大于零,您想打印它们。@kaya3啊,好的,谢谢。非常感谢您的帮助!出于好奇,我搜索了f格式,它说它比str.format()快得多。如果str.format()代替了f格式,程序还能工作吗?你可以使用任何你喜欢的字符串格式方法。我在回答中使用了f字串,只是因为我觉得它们很整洁。
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}'
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)]))