CS50贪婪需要建议

时间:2017-08-17 20:19:15

标签: c cs50

我正在做cs50问题集"贪婪"。基本上要求用户欠下多少变化,然后输出可以等于输入量的最小硬币数量。它工作得很好,除非我输入4.2,它应输出22输出18。

#include <cs50.h>
#include <stdio.h>


int main(void)
{
    float n;
    do
    {
        n = get_float("How much change is owed?\n");
    }
    while(n == EOF);

    int cents = (int)(n * 100);
    int minimumamountofcoins = 0;
    if (cents/25 >= 1){
        while (cents/25 >= 1)
        {
            cents -= 25;
            minimumamountofcoins++;
        }

    }
    if (cents/10 >= 1){
        while (cents/10 >= 1)
        {
            cents -= 10;
            minimumamountofcoins++;
        }
    }
    if(cents/5 >= 1){
        while (cents/5 >= 1)
        {
            cents -= 5;
            minimumamountofcoins++;
        }
    }
    if (cents/1 >= 1){
        while (cents/1 >= 1)
        {
            cents -= 1;
            minimumamountofcoins++;
        }
    }
    printf("The minimum amount of coins is %d\n", minimumamountofcoins);
}

2 个答案:

答案 0 :(得分:3)

看起来这是从float到int的转换问题。当您尝试将美元转换为美分时,您可以使用以下代码进行转换:

int cents = (int)(n * 100);

然而,这行代码为4.20美元,返回分值为419.这是舍入和浮点数的问题,因为4.2 * 100返回419.99999999而不是420.0000000,整数转换截断而不是舍入。 $ 4.18也会出现此问题,也可能是其他值。

为了防止这种情况,请在演员表之前添加0.5,如下所示:

int cents = (int)(n * 100 + 0.5);

这将确保舍入在正确的方向上进行,因为您从不会因为一个微不足道的浮动错误而离开。

使用math.h库,你也可以使用roundf()函数,这个函数适用于负数,以防万一。

int cents = (int)(roundf(n*100));

答案 1 :(得分:0)

使用四舍五入功能将数字四舍五入。在代码的这一部分中,您需要添加round函数。

int cents = (int)(n * 100);

必须是这样的:

cents = round(n * 100);

如果还有其他此类问题,则可以使用调试器,例如debug50,在其中通过单击行号右侧的位置来设置断点,然后在终端窗口(执行clang的窗口)中,类型:

~/pset1/cash/ $ debug50 ./cash

或者您的程序被调用。这将打开调试器,并在其中找到所有变量及其相等值。按下播放按钮旁边的按钮,向前移动一行代码。