cs50 pset1贪心不寻常的bug

时间:2016-09-03 19:57:13

标签: c greedy cs50

除了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);
}

3 个答案:

答案 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;来消除这些不需要的值。命令。