为什么在输入的零钱是2.2时输出显示正确答案,要求输入的最小硬币数却在输入4.2时输出不正确?

时间:2019-01-26 15:17:15

标签: c loops while-loop cs50

我是编码的新手,我一直在尝试CS50的问题cash.c。在这个问题上,收银员必须仅使用25、10、5和1美分来提供最少的找零额。

我一直在遇到输出问题,我只提到了使用25美分和10美分的问题。对于2.2,我应该得到的答案是10,这就是我得到的;但是对于4.2,我应该得到的答案是18,而我得到的答案是22。为什么会这样?

我们将提供有益的建议和建设性的批评。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int clear_buffer()
{
int c;
while((c=getchar())!='\n' && c!=EOF);
}
int main(void)
{
fflush(stdin);
float a=0,b=0,c=0,d=0,e=0;
float n;
do
{
printf("The change is ");
}
while ((scanf("%f",&n)!=1) && clear_buffer() || n<0);

while((n-0.25)>=0)
{
    n=n-0.25;
    a++;
}
while((n-0.10)>=0)
{
    n=n-0.10;
    b++;
}
while((n-0.05)>=0)
{
    n=n-0.05;
    c++;
}
while((n-0.01)>=0)
{
    n=n-0.01;
    d++;
}
printf("The minimum coins required are %f", (a+b+c+d));
}

1 个答案:

答案 0 :(得分:1)

您看到的问题是由floating point precision limitations引起的。如果您调试程序,如下面在屏幕快照中使用onlinegdb所示(如果您还不太熟悉在命令行上使用GDB,则必须学习,但这可能是一个好的第一步)。这与https://cs50.stackexchange.com/questions/2259/greedy-c-works-for-all-numbers-except-4-2密切相关(其中还针对潜在的解决方法/解决方案提供了一些建议)。

enter image description here 请注意,减去第一个n之后的0.10的值确实小于0.10,但是却是0.0999998078,因此它只认为有一角钱,而不是2角钱。在期待。

对于建设性的批评,您的缩进有点差(不确定这是否是此处粘贴导致的),您有未使用的变量ea,{{ 1}},bc变量可能是d,而不一定是浮点数,您可以通过重用int0.25来获得一些神奇的数字等等,这些应该是预先声明的常量,甚至可能是0.10语句。还有其他事情,如果您真的有兴趣,可以在完成所有可以想到的改进之后,可以在姐妹网站code review上发布。