我是编码的新手,我一直在尝试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));
}
答案 0 :(得分:1)
您看到的问题是由floating point precision limitations引起的。如果您调试程序,如下面在屏幕快照中使用onlinegdb所示(如果您还不太熟悉在命令行上使用GDB,则必须学习,但这可能是一个好的第一步)。这与https://cs50.stackexchange.com/questions/2259/greedy-c-works-for-all-numbers-except-4-2密切相关(其中还针对潜在的解决方法/解决方案提供了一些建议)。
请注意,减去第一个n
之后的0.10
的值确实小于0.10
,但是却是0.0999998078
,因此它只认为有一角钱,而不是2角钱。在期待。
对于建设性的批评,您的缩进有点差(不确定这是否是此处粘贴导致的),您有未使用的变量e
,a
,{{ 1}},b
,c
变量可能是d
,而不一定是浮点数,您可以通过重用int
,0.25
来获得一些神奇的数字等等,这些应该是预先声明的常量,甚至可能是0.10
语句。还有其他事情,如果您真的有兴趣,可以在完成所有可以想到的改进之后,可以在姐妹网站code review上发布。