python找到最小数量的硬币
我的任务是制定一个程序,将采取货币数额,并找到最低数量的硬币需要得到该数额。这是我的密码python找到最小数量的硬币,python,python-3.x,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
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
如有任何提示,将不胜感激,谢谢
编辑了我的一个输入错误,但代码仍然没有按预期工作。看起来像是一个输入错误:
nickels
vsnickels
编辑:既然你已经修正了打字错误,看起来这肯定是一个取整问题。由于您正在将美元转换为整数美分,因此在执行任何操作之前,请尝试将其转换为整数
将您的
n1=n1*100
行更改为n1=int(圆形(n1*100))
。我在我的电脑上试了一下,它似乎起了作用。看起来像是打字错误:nickles
vsnickles
编辑:既然你已经修正了打字错误,看起来这肯定是一个取整问题。由于您正在将美元转换为整数美分,因此在执行任何操作之前,请尝试将其转换为整数
将您的
n1=n1*100
行更改为n1=int(圆形(n1*100))
。我在我的电脑上试用了这个方法,似乎效果不错。您遇到了浮点问题:
>>>> 1.15*100
114.99999999999999
正如你所看到的,这里你显然没有115美分。你就在那下面。所以你用一美元、一角硬币和4.99999便士(int
四舍五入)
解决此问题的最简单方法是让用户给您一个整数美分,这样您就可以在整个时间内以美分为单位工作,或者使用内置的
round
函数来消除浮点错误。您遇到了浮点问题:
>>>> 1.15*100
114.99999999999999
正如你所看到的,这里你显然没有115美分。你就在那下面。所以你用一美元、一角硬币和4.99999便士(int
四舍五入)
解决这个问题最简单的方法是让用户给你一个整数美分,这样你就可以一直用美分工作,或者使用内置的
round
函数来消除浮点错误。对于这类问题,最好一直使用美分。试着用105美分(整数)代替1.05乘以100。你可以避免把所有的东西凑在一起。此外,由于您关心“余数”,请使用模运算符而不是除法
我会这样解决:
cents = 115
remainder = cents%25
nickels = (cents - remainder)/25
cents = remainder
remainder = cents%10
dimes = (cents - remainder)/10
...
等等
然而,可能不是你问的问题,但在一般情况下,这个问题是NP难的,而且根据硬币面额的不同,一些变化是不可能的。对于这类问题,最好一直使用美分。试着用105美分(整数)代替1.05乘以100。你可以避免把所有的东西凑在一起。此外,由于您关心“余数”,请使用模运算符而不是除法 我会这样解决:
cents = 115
remainder = cents%25
nickels = (cents - remainder)/25
cents = remainder
remainder = cents%10
dimes = (cents - remainder)/10
...
等等
然而,可能不是你问的问题,但在一般情况下,这个问题是NP难的,并且进一步取决于硬币面额,一些变化是不可能的。你可以参考更全面的解释,但基本上是在你的代码中键入1.05
(或通过eval
)它不存储您可能期望的确切值:
>>> (1.05).as_integer_ratio()
(4728779608739021, 4503599627370496)
如果希望计算机存储数字的精确十进制表示形式,只需在中间步骤中使用:
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.
def美元对美分:
n、 _u,end=s.分区(“.”)
如果不是全部(对于结尾[2:]中的i,i==“0”):
raise VALUE ERROR(“小数点后最多只能有两位数字”)
return int(“{}{:0您可以参考以获得关于发生了什么的更全面的解释,但基本上当您在代码中键入1.05
(或通过eval
)时,它不会存储您可能期望的准确值:
>>> (1.05).as_integer_ratio()
(4728779608739021, 4503599627370496)
如果希望计算机存储数字的精确十进制表示形式,只需在中间步骤中使用:
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.
def美元对美分:
n、 _u,end=s.分区(“.”)
如果不是全部(对于结尾[2:]中的i,i==“0”):
raise VALUE ERROR(“小数点后最多只能有两位数字”)
返回int(“{}{:0为什么使用eval
而不是int
或float
?@KevinMGranger我假设它通过2to3
脚本,因为它将python2的输入(…)
更改为eval(输入(…)
我无法重现这种行为,您可以添加print(repr(n1))
在每一步之间?我有一种感觉,浮点操作要对此负责。是的,浮点操作是罪魁祸首,我建议将eval
切换为decimal.decimal
,看看这是否解决了您的问题,或者让用户以美分输入数字,跳过n1*100
步骤,或者usinground
为什么使用eval
而不是int
或float
的可能重复?@KevinMGranger我假设它通过2to3
脚本,因为它将python2的输入(…)
更改为eval(输入(…)
我无法重现那种行为,你能添加print(repr(n1))
在每一步之间?我有一种感觉,浮点操作要对此负责。是的,浮点操作是罪魁祸首,我建议将eval
切换为decimal.decimal
,看看这是否解决了您的问题,或者让用户以美分输入数字,跳过n1*100
步骤,或者usinground
感谢的可能副本,