硬币变化问题(但硬币数量最少)



所以我是编码新手,我接到了一项任务,我需要制作一个程序,该程序可以为少于一美元的季度、一角钱、镍币和美分提供零钱。但是,作业希望程序打印所需的最小硬币数量(例如,如果我输入 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")

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

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",则需要更多逻辑。

或者使用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 个项目,则最后一项应以and
  • 开头

例子:

  • ['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)]))

我认为其他回答者推断出的要求可能比你的作业更严格。示例输出包含逗号和单词"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')

最新更新