我正在做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));