我正在编写一个贪心算法(已经使我头疼不已),该算法输出可用于某些货币值的最小数量的硬币,最终我得到了满意的代码,或者以为如此。输入值.41
时,我返回了正确的4 coins
-但是,输入.01
返回了2 coins
,我不知道为什么。
// declare variable change_owed, num_coins, and input globally
float change_owed = 0;
float dollars;
int cents;
int num_coins;
int main(void)
{
// makes sure the input is non-negative
do
{
dollars = get_float("Change owed:\n");
cents = round(dollars * 100);
}
while(cents <= 0);
// begin checking
while(cents - 25 >= 0) // quarters
{
num_coins++; // number of coins used, to be printed later, is incremented
cents = cents - 25; // coin is subtracted from total
}
while(cents - 10 >= 0) // dimes
{
num_coins++;
cents = cents >= 10;
}
while(cents - 5 >= 0) // nickels
{
num_coins++;
cents = cents - 5;
}
while(cents >= 0) // pennies
{
num_coins++;
cents = cents - 1;
}
printf("%i coins\n", num_coins);
}
答案 0 :(得分:2)
主要问题(减少一枚硬币):
while(cents >= 0) // pennies
应该是
while (cents - 1 >= 0) // or even better: while (cents >= 1)
还有一个错字:
cents = cents >= 10;
应该是
cents = cents - 10; // or even better: cents -= 10;
答案 1 :(得分:1)
据我所知,您尚未初始化 num_coins
int num_coins = 0;
您为什么使用while循环?整数算术同样容易。由于 cents 是一个整数,因此将其除以另一个整数将仅返回整数部分(有效地四舍五入)。
num_coins = cents / 25; // returns the integer part, count of quarters
// This is an alternative to initialization
cents %= 25; // modulus operator returns the remainder
num_coins = num_coins + cents / 10; // count of dimes
cents %= 10;
num_coins = num_coins + cents / 5; // count of nickles
cents %= 5;
num_coins += cents; // cents must equal number of pennies required.
好的,我没有测试上面的代码,所以可能会有一些错误,但是您明白了。