有人可以检查算法

时间:2014-09-03 20:11:41

标签: c algorithm

此算法输入一个浮动值i,表示金额并返回支付该金额所需的最小硬币数,并返回一个整数c。

  

值c1 = 25,c2 = 10,c3 = 5,c4 = 1

我的代码完全适用于输入,除了i = 4.2它应该返回18个硬币而不是它返回22个硬币

i=i*100;

while (i>0) {
    if(i>=25) {
        c = (int) i/25;
        i= (int) i%25;
    }
    else if (i>=10 && i<25) {
        c = c + (int) i/10;
        i=(int) i%10;
    }

    else if(i>=5 && i<10) {
        c = c + (int) i/5;
        i = (int) i%5;
    }
    else if(i<5) {
        c = c + (int) i/1;
        i = (int) i%1;
    }
}

printf("%d\n",c);

1 个答案:

答案 0 :(得分:2)

问题在于浮点精度。

float i = 4.2;
i *= 100;
printf("%f\n", i);

打印:419.999969而不是4.2,在这种情况下,419是硬币问题中使用的值,导致使用了22个硬币16 of 25,{{ 1}},1 of 101 of 5 = 4 of 1

使用:total 22代替i = round(i * 100);

你需要考虑相等的值,例如:如果(i> = 10&amp;&amp; i&lt; 25),则范围是[ini,fin],在开始时关闭,在结束时打开。如果您按i = i * 100;更改else if,则不需要if

最终代码:

while loop

有关 What Every Programmer Should Know About Floating-Point Arithmetic

的更多信息