python找到最小数量的硬币

时间:2016-05-03 16:29:06

标签: python python-3.x

我的任务是制作一个程序,它将花费金额并找到获得该金额所需的最小硬币数量。这是我的代码。

import math

n1 = eval(input("Enter a monetary amount: "))

n1 = n1 * 100

dollars = 0
quarters = 0
dimes = 0
nickels = 0
pennies = 0

dollars = n1 / 100
n1 %= 100

quarters = n1 / 25 
n1 %= 25

dimes = n1 / 10 
n1 %= 10

nickels = n1 / 5 
n1 %= 5

pennies = n1


print (int(dollars), int(quarters), int(dimes), int(nickels), int(pennies))

每当我输入需要镍币的数字时,它都不计算它们。例如,1.05的输出将是

1 0 0 0 0

1.15的输出是

1 0 1 0 4

任何提示都将不胜感激,谢谢。

编辑了我的拼写错误,代码仍未按预期工作。

4 个答案:

答案 0 :(得分:0)

看起来像拼写错误:nickels vs nickles

编辑:既然您已经修正了拼写错误,看起来它肯定是一个四舍五入的问题。由于您将美元转换为整数美分,因此请在执行任何操作之前将其转换为整数。

n1 = n1 * 100行更改为n1 = int(round(n1 * 100))。我在我的电脑上尝试过它,它似乎有效。

答案 1 :(得分:0)

您正在遇到浮点问题:

>>>> 1.15*100
114.99999999999999

如你所见,这里你显然没有115美分。你有只是。所以你使用1美元,1美分和4.99999便士(int将其减至4)。

修复它的最简单方法是让用户给你一个整数的分数,这样你就可以在整个时间内工作,或者使用内置的round函数来摆脱浮动点错误。

答案 2 :(得分:0)

对于这类问题,最好与美分一起工作。尝试制作105美分(整数)而不是1.05倍。你可以避免一起舍入。此外,由于您关心"余数",请使用模运算符而不是除法。

我这样解决:

cents = 115
remainder = cents%25
nickels = (cents - remainder)/25

cents = remainder
remainder = cents%10
dimes = (cents - remainder)/10

...

等等。

然而,可能不是你提出的问题,但在一般情况下,这个问题是NP难的,而且进一步取决于硬币面额,一些变化是不可能的。

答案 3 :(得分:0)

您可以参考Is floating point math broken?获取有关正在发生的事情的更全面的解释,但基本上当您在代码中输入1.05时(或通过eval)它不存储您可能期望的确切价值:

>>> (1.05).as_integer_ratio()
(4728779608739021, 4503599627370496)

如果您希望计算机存储数字的精确十进制表示,您只需使用decimal.Decimal作为中间步骤:

n1 = decimal.Decimal(input("Enter a monetary amount: "))

n1 = int(n1 * 100) #now you won't get rounding issues

或者你可以解析自己输入的数字来删除小数并跳过所需的数学来补偿所有的数据:

def dollar_to_cent(s):
    n,_,end = s.partition(".")
    if not all(i=="0" for i in end[2:]):
        raise ValueError("can only have up to two digits after decimal.")
    return int("{}{:0<2}".format(n,end[:2]))

>>> dollar_to_cent("1")
100
>>> dollar_to_cent("2.")
200
>>> dollar_to_cent("2.3")
230
>>> dollar_to_cent("2.05")
205
>>> dollar_to_cent("2.050000")
205
>>> dollar_to_cent("2.001")
Traceback (most recent call last):
   ...
ValueError: can only have up to two digits after decimal.