为什么我的最小硬币计算器在输入 0.41 和 4.2 时返回不正确的结果?
Why is my minimum-coin calculator returning incorrect results for inputs of 0.41 and 4.2?
我正在处理 CS50x 的 pset1 的现金问题。该程序应该在给定浮点数输入的情况下打印找零所需的最少硬币数 (US)。我很难弄清楚我的代码有什么问题。程序 returns 正确输出某些值,如 23、0.01 和 0.15,但 returns 不正确的值,特别是 0.41 和 4.2,分别返回 3 和 22 而不是 4 和 18。我'我已经多次检查这段代码,但我找不到任何东西。我唯一的想法是浮点数可能会变圆或被截断,但我真的不知道。
#include <stdio.h>
#include <cs50.h>
float total_coins = 0;
float get_coin_amount(float amount, float coin_value);
int main(void)
{
float change = get_float("Change owed: ");
get_coin_amount(get_coin_amount(get_coin_amount(get_coin_amount(change, 0.25), 0.1), 0.05), 0.01);
printf("%f\n", total_coins);
}
float get_coin_amount(float amount, float coin_value)
{
float revised_amount = amount; //revised amount will be used to give a working total of the amount left
while (revised_amount >= coin_value) //continue until the coin value can no longer go into the remaining amount
{
total_coins++; //update coins counter
revised_amount = revised_amount - coin_value;//updates revised_amount
}
return revised_amount; //return remainder left after the coin goes into it as many times as possible
}
我认为你应该使用整数而不是浮点数。
即,将 change 乘以 100 并转换为 int。使用 25、10、5、1 作为硬币值。否则看起来很结实。
编辑:您的解决方案有缺陷。它实际上在任何时候都不 return 正确的硬币数量。似乎只适用于单个硬币的倍数。
应该看起来更像这样:
float get_coin_amount(float amount, float coin_value)
{
float revised_amount = amount; //revised amount will be used to give a working total of the amount left
while (revised_amount >= coin_value) //continue until the coin value can no longer go into the remaining amount
{
total_coins++; //update coins counter
revised_amount = revised_amount - coin_value;//updates revised_amount
}
if (revised_amount > 0) {
if (coin_value == 25) {
return total_coins + get_coin_amount(revised_amount, 10);
} else if (coin_value == 10) {
return total_coins + get_coin_amount(revised_amount, 5);
} else {
return total_coins + get_coin_amount(revised_amount, 1);
}
} else {
return total_coins;
}
}
然后像这样调用方法:
amount = (int) (get_float(...) * 100);
num_coins = get_coin_amount(amount, 25);
我正在处理 CS50x 的 pset1 的现金问题。该程序应该在给定浮点数输入的情况下打印找零所需的最少硬币数 (US)。我很难弄清楚我的代码有什么问题。程序 returns 正确输出某些值,如 23、0.01 和 0.15,但 returns 不正确的值,特别是 0.41 和 4.2,分别返回 3 和 22 而不是 4 和 18。我'我已经多次检查这段代码,但我找不到任何东西。我唯一的想法是浮点数可能会变圆或被截断,但我真的不知道。
#include <stdio.h>
#include <cs50.h>
float total_coins = 0;
float get_coin_amount(float amount, float coin_value);
int main(void)
{
float change = get_float("Change owed: ");
get_coin_amount(get_coin_amount(get_coin_amount(get_coin_amount(change, 0.25), 0.1), 0.05), 0.01);
printf("%f\n", total_coins);
}
float get_coin_amount(float amount, float coin_value)
{
float revised_amount = amount; //revised amount will be used to give a working total of the amount left
while (revised_amount >= coin_value) //continue until the coin value can no longer go into the remaining amount
{
total_coins++; //update coins counter
revised_amount = revised_amount - coin_value;//updates revised_amount
}
return revised_amount; //return remainder left after the coin goes into it as many times as possible
}
我认为你应该使用整数而不是浮点数。
即,将 change 乘以 100 并转换为 int。使用 25、10、5、1 作为硬币值。否则看起来很结实。
编辑:您的解决方案有缺陷。它实际上在任何时候都不 return 正确的硬币数量。似乎只适用于单个硬币的倍数。
应该看起来更像这样:
float get_coin_amount(float amount, float coin_value)
{
float revised_amount = amount; //revised amount will be used to give a working total of the amount left
while (revised_amount >= coin_value) //continue until the coin value can no longer go into the remaining amount
{
total_coins++; //update coins counter
revised_amount = revised_amount - coin_value;//updates revised_amount
}
if (revised_amount > 0) {
if (coin_value == 25) {
return total_coins + get_coin_amount(revised_amount, 10);
} else if (coin_value == 10) {
return total_coins + get_coin_amount(revised_amount, 5);
} else {
return total_coins + get_coin_amount(revised_amount, 1);
}
} else {
return total_coins;
}
}
然后像这样调用方法:
amount = (int) (get_float(...) * 100);
num_coins = get_coin_amount(amount, 25);