我有一个家庭作业,其中我们必须编写一个程序,以使用最少的硬币数量输出自动售货机要提供的找零。例如。可将£3.67分配为1x£2 + 1x£1 + 1x50p + 1x10p + 1x5p + 1x2p。
但是,我的程序输出了错误的数字。我知道可能会有四舍五入的问题,但是我认为当前的问题与我的编码方法有关。
change=float(input("Input change"))
twocount=0
onecount=0
halfcount=0
pttwocount=0
ptonecount=0
while change!=0:
if change-2>-1:
change=change-2
twocount+=1
else:
if change-1>-1:
change=change-1
onecount+=1
else:
if change-0.5>-1:
change=change-0.5
halfcount+=1
else:
if change-0.2>-1:
change=change-0.2
pttwocount+=1
else:
if change-0.1>-1:
change=change-0.1
ptonecount+=1
else:
break
print(twocount,onecount,halfcount,pttwocount,ptonecount)
结果:
Input: 2.3
Output: 11010
i.e. 3.2
Input: 3.2
Output:20010
i.e. 4.2
Input: 2
Output: 10001
i.e. 2.1
答案 0 :(得分:2)
您所有的比较都使用> -1,因此只要余额超过-1,就给出更改。
如果您只处理整数,这是正确的,因为> -1等于> = 0。
但是对于浮点数,例如,我们有-0.5> -1,因此我们将给出负余额的变化(我们不希望如此)。
所以正确的方法是用> = 0(大于或等于0)比较替换所有> -1比较。
答案 1 :(得分:0)
问题在于它如何使用if/else
语句计算更改。如果您遍历第一个示例,change-2>-1
将注册为真,然后结果将为.3
,但是在下一个循环中,if change - 1 > -1
可能是错误的,但实际上不是{{1 }}。最好的方法之一是使用Python的下层-0.7
和mod //
运算符。您必须舍入一些计算because of the way Python handles floats
%
但是给定输入会产生
change=float(input("Input change"))
twocount=0
onecount=0
halfcount=0
pttwocount=0
ptonecount=0
twocount = int(change//2)
change = round(change%2,1)
if change//1 > 0:
onecount = int(change//1)
change = round(change%1,1)
if change//0.5 > 0:
halfcount = int(change//0.5)
change = round(change%0.5, 1)
if change//0.2 > 0:
pttwocount = int(change//0.2)
change = round(change%0.2, 1)
if change//0.1 > 0:
ptonecount = int(change//0.1)
change = round(change%0.1,1)
print(twocount,onecount,halfcount,pttwocount,ptonecount)