【问题标题】:Why does output shows correct answer for min number of coins required when the change entered is 2.2 but shows the incorrect output when I enter 4.2?为什么当输入的零钱为 2.2 时输出显示所需的最小硬币数的正确答案,但当我输入 4.2 时显示不正确的输出?
【发布时间】:2019-01-26 15:17:15
【问题描述】:

我是编码新手,我一直在尝试 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));
}

【问题讨论】:

  • 您可能想阅读以下内容:How to debug small programs
  • 您可能想看看CS50 stack site(并考虑加入)。这个问题已经在那个论坛上回答过很多次了。 Here 就是一个例子。只需在该网站上搜索“4.2”,您就会找到大量答案。
  • 我建议不要为此使用 float 变量或浮点数学。那里有一些潜在的陷阱,尽管我不清楚这是否是你问题的根源。相反,使用整数变量和整数数学,将钱表示为整数美分而不是小数美元。

标签: c loops while-loop cs50


【解决方案1】:

您看到的问题是由floating point precision limitations 引起的。如果你调试程序,如下面的截图所示,使用onlinegdb步)。这与https://cs50.stackexchange.com/questions/2259/greedy-c-works-for-all-numbers-except-4-2 密切相关(其中也有一些关于潜在变通办法/解决方案的建议)。

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

至于建设性的批评,你的缩进有点差(不确定这是否只是由这里的复制粘贴引起的),你有一个未使用的变量e,你的ab,@987654334 @、d 变量可以是 ints,不一定是浮点数,您可以通过重用 0.250.10 等来获得一些神奇的数字,这些应该是预先声明的常量,甚至可能是 @987654339 @ 声明。还有其他的东西,如果你真的有兴趣,你可以在完成所有你能想到的改进后,在姐妹网站code review 上发帖。

【讨论】:

  • 非常感谢您的解释和反馈。我一定会学会更好地调试。老实说,调试是我从未关注过的事情。
  • @MohammadAnas 不客气。如果您坚持使用 C 或任何编程语言,它肯定会派上用场。 gdb 将让您在相关堆栈/帧上查看任何相关内存及其值,这也是一个很好的学习体验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2020-09-10
相关资源
最近更新 更多