此算法输入一个浮动值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);
答案 0 :(得分:2)
问题在于浮点精度。
float i = 4.2;
i *= 100;
printf("%f\n", i);
打印:419.999969
而不是4.2
,在这种情况下,419
是硬币问题中使用的值,导致使用了22个硬币16 of 25
,{{ 1}},1 of 10
和1 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
的更多信息