硬币找零问题(但硬币数量最少)

时间:2020-01-23 05:25:15

标签: python python-3.x

所以我是编码的新手,我接到一个作业,在那里我需要做一个程序,以不到四分之一的硬币,角钱,镍币和美分的零钱进行找零。但是,该作业希望程序打印所需的最少硬币数量(例如,如果我输入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")

4 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  • 应该用option分隔三个以上的项目
  • 如果有多个项目,则最后一个项目之前应加', '

示例:

  • 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]]) ,则名词后跟's'。但是,令人讨厌的是,如果名词以1结尾,您想将其替换为'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]))

答案 3 :(得分:0)

我认为其他回答者提出的要求比您分配的要求更严格。您的示例输出中包含逗号和单词“ 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')