除了4.2之外,我的贪婪程序代码适用于所有数字。 如果有人能指出错误
,真的很感激:) greedy.c exists
:) greedy.c compiles
:) input of 0.41 yields output of 4
:) input of 0.01 yields output of 1
:) input of 0.15 yields output of 2
:) input of 1.6 yields output of 7
:) input of 23 yields output of 92
**:( input of 4.2 yields output of 18
\ expected output, but not "22\n"**
:) rejects a negative input like -.1
:) rejects a non-numeric input of "foo"
:) rejects a non-numeric input of ""
#include <stdio.h>
#include <cs50.h>
int main(void)
{
float x;
do
{
printf("how much change is owed(in dollars)?:\n");
x = GetFloat();
}
while (x < 0);
x = x*100;
int i = 0;
while (x >= 25)
{
x = (x-25);
i++;
}
while (x >= 10)
{
x = (x-10);
i++;
}
while (x >= 5)
{
x = (x-5);
i++;
}
while (x >= 1)
{
x = (x-1);
i++;
}
printf("%d\n",i);
}
答案 0 :(得分:0)
更改以下行
x = x*100;
进入
x = floor(x*100);
printf("rounded value: %f\n", x);
它将打印rounded value: 419
,而22这是正确的答案。
(16x25 + 1x10 + 1x5 + 4x1)
这就是现在正在发生的事情,因为x
中存储的值接近420但略小一些。
答案 1 :(得分:0)
这个错误与浮点不精确有关,运行以下代码,你会看到引擎盖下真正发生的事情:
float x = 4.2;
printf("%.50f\n", x);
所以相反,最好首先将值转换为对应于美分的整数值的正整数(记住$ 4.2与420美分相同),并使用此值进行计算(并且不要忘记舍入价值第一)。
答案 2 :(得分:0)
浮点数总是不精确。因此,建议我们将float
转换为int
。你可以这样做
int amount = lroundf(change*100);
还要注意该值乘以100倍。这是为了摆脱分数,然后使用&#39; lroundf&#39;来消除这些不需要的值。命令。