我必须制作一个项目,包括计算形成数字所需的硬币数量。你有四分之一,硬币,镍币和硬币,你需要用尽可能少的硬币来形成一个数字。您需要表格的号码会提示给用户。
这在Python中非常简单(我实现了一个快速执行的功能):
def calculate_change(change):
count = 0
change*=100
change = int(change)
if change // 25 != 0:
count = change // 25
change = change % 25
if change // 10 != 0:
count += change // 10
change = change % 10
if change // 5 != 0:
count += change // 5
change = change % 5
if change // 1 != 0:
count += change // 1
print count
calculate_change(73)
现在,要在C中实现这一点,我遇到了一些麻烦。我不太明白如何更改用户提示的浮动。我需要先将它转换为double,乘以100,然后转换为int,但我遇到了麻烦。 这就是我为此写的:
int main(void)
{
float n;
do
{
printf("Change you need: ");
n = GetFloat();
}
while (n < 0);
n = floorf(n * 100 + 0.5) / 100;
int change = (int) n;
change = change * 100;
int count = 0;
if (change / 25 != 0)
{
count = change / 25;
change = change % 25;
}
if (change / 10 != 0)
{
count = count + change / 10;
change = change % 10;
}
if (change / 5 != 0)
{
count = count + change / 5;
change = change % 5;
}
if (change / 1 != 0)
{
count = count + change / 1;
change = change % 1;
}
printf("%d\n", count);
}
在C中从浮点数转换为整数是否有问题?当用户提示0到1之间的数字时,程序返回不正确的结果(总是0)。
谢谢!
答案 0 :(得分:3)
<强>问题强>
n = 0.5
时,
floorf(n * 100 + 0.5) / 100 = floorf(50.5)/100 = 50/100 = 0.5
因此,声明
n = floorf(n * 100 + 0.5) / 100;
不会更改n
的值。现在,执行时:
int change = (int) n;
change
设置为0
。这就解释了为什么0
之间n
的大多数0.0-1.0
值得n = floorf(n * 100 + 0.5) / 100;
int change = (int) n;
change = change * 100;
。
<强>解决方案强>
我会替换以下几行:
n = floorf(n * 100 + 0.5); // Just to make sure rounding occurs properly.
// Thanks to Mark Ransom.
int change = (int) n;
与
{{1}}
答案 1 :(得分:1)
你是正确的,你需要乘以100,然后转换为int,这就是你在python代码中所做的,但在你的C代码中你正在向后做 - 首先转换为int然后乘以100:
int change = (int) n;
change = change * 100;
该(int)强制转换将值截断为下一个最低整数,因此0到1之间的n值始终设置为0.
将乘法移动100可确保在转换为美分的整数之前将美元(例如0.56)转换为美分的浮点表示(例如56.0),例如(56):
int change = (int) (n * 100);