我正在做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);
}
答案 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
或者您的程序被调用。这将打开调试器,并在其中找到所有变量及其相等值。按下播放按钮旁边的按钮,向前移动一行代码。