使用python计算找零的最小硬币数量时出现问题

时间:2019-06-15 17:29:35

标签: python python-3.x algorithm

我有一个家庭作业,其中我们必须编写一个程序,以使用最少的硬币数量输出自动售货机要提供的找零。例如。可将£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

2 个答案:

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