我正在做CS50问题集“ Greedy”。基本上问用户欠多少零钱,然后输出可以等于输入金额的最小硬币数量。它运行完美,除了我输入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);
}

最佳答案

看起来这是从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));

08-19 23:38