首页 > 解决方案 > 有没有办法为 CS50 Cash 问题集 1 运行以下代码

问题描述

我对 CS 和编程非常陌生,正在尝试为 cs cash 问题集 1 编写代码。我认为这不是预期的解决方案,我知道这不是一个干净简洁的代码,但是在这个点我只是想让它运行。我想知道我写的代码是否完全是乱码,或者它是否真的可以工作,因为它在理论上对我来说真的很有意义。

  #include<stdio.h>
#include<cs50.h>
#include<math.h>
int main(void)
{
    float change;
    do
    {
     change= get_float("Enter change here\n");
    }
     while(change<0);
    int quarter=floor(change/0.25);
    int dime=floor((change-(quarter*0.25))/0.10);
    int nickel=floor((change-(quarter*0.25)-(dime*0.10))/0.05);
     int penny=round((change-(quarter*0.25)-(dime*0.10)-(nickel*0.05))/0.01);
    int sum =quarter+nickel+dime+penny;
    printf("%i",sum);
   
     
}

        

标签: ccs50

解决方案


这是许多初学者都在努力解决的一个常见问题,即浮点数的不精确性。使用浮点数和双精度数进行运算时,结果值可能会偏离小数点。您可以在此 SO 帖子中了解更多信息:为什么浮点数不准确?.

无论如何,您的程序涉及浮点除法和整数截断,它们通常不能很好地协同工作。在 $4.20 作为输入的示例中,在 Quarters 设置为 16 之后,在计算一角钱时,(4.2 - 0.25 x 16) / 0.10 实际上保存为 1.999998,而不是 2。然后将其截断(因为一角钱是一个整数)并保存为 1,这解释了您的程序给您的输出不准确。一个解决方案是将所有内容乘以 100,使用整数除法来避免不精确。所以上面的例子会变成 (420 - 25 x 16) / 10,它会在你的一角整数中正确地保存为 2。


推荐阅读