贪心计划运行永远
Greedy Program Running Forever
我最近开发了一个简单的程序,旨在获取一定数量的钱(美元)并确定满足该要求所需的最少硬币数量。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
// prompts for change and assigns variable owed_change that value
float owed_change = -1;
while (owed_change < 0 )
{
printf("How much change is owed?\n");
owed_change = GetFloat();
}
// sets the varialble n_coins to 0
int n_coins = 0;
// repeats until no more change is owed
while (owed_change != 0)
{
/* checks for the biggest coin that can be used and increases
the number of coins by 1 */
if (owed_change >= .25)
{
owed_change -= .25;
n_coins++;
}
else if (owed_change >= .10)
{
owed_change -= .10;
n_coins++;
}
else if (owed_change >= .05)
{
owed_change -= .05;
n_coins++;
}
else
{
owed_change -= .01;
n_coins++;
}
}
printf("%d\n", n_coins);
}
该程序适用于 .25
的倍数,但适用于任何其他数字。通过测试,我发现它与变量owed_change
被从-0
中减去并得到满足owed_change != 0
的结果有关。但是,通过研究,我发现 -0
作为浮点数应该充当 +0
。如果是这样,我还做错了什么?
在您的情况下,最好将钱作为美分使用并将所有值乘以 100。这样做的原因是浮点数不是精确值;这就是为什么您的代码适用于 0.25 等浮点值,但不适用于 0.1、0.05 和 0.01 等较小的浮点数的原因。为了您的目的,您最好使用 int 值。
而不是:
- 0.25$,使用 25 美分
- 0.10$,使用 10 美分
- 0.05 美元,使用 5 美分
- 0.01$,使用 1 美分
在进行上述更改后,将 owed_change
的数据类型从 float 更改为 int
。那应该可以解决您的问题。
我最近开发了一个简单的程序,旨在获取一定数量的钱(美元)并确定满足该要求所需的最少硬币数量。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
// prompts for change and assigns variable owed_change that value
float owed_change = -1;
while (owed_change < 0 )
{
printf("How much change is owed?\n");
owed_change = GetFloat();
}
// sets the varialble n_coins to 0
int n_coins = 0;
// repeats until no more change is owed
while (owed_change != 0)
{
/* checks for the biggest coin that can be used and increases
the number of coins by 1 */
if (owed_change >= .25)
{
owed_change -= .25;
n_coins++;
}
else if (owed_change >= .10)
{
owed_change -= .10;
n_coins++;
}
else if (owed_change >= .05)
{
owed_change -= .05;
n_coins++;
}
else
{
owed_change -= .01;
n_coins++;
}
}
printf("%d\n", n_coins);
}
该程序适用于 .25
的倍数,但适用于任何其他数字。通过测试,我发现它与变量owed_change
被从-0
中减去并得到满足owed_change != 0
的结果有关。但是,通过研究,我发现 -0
作为浮点数应该充当 +0
。如果是这样,我还做错了什么?
在您的情况下,最好将钱作为美分使用并将所有值乘以 100。这样做的原因是浮点数不是精确值;这就是为什么您的代码适用于 0.25 等浮点值,但不适用于 0.1、0.05 和 0.01 等较小的浮点数的原因。为了您的目的,您最好使用 int 值。
而不是:
- 0.25$,使用 25 美分
- 0.10$,使用 10 美分
- 0.05 美元,使用 5 美分
- 0.01$,使用 1 美分
在进行上述更改后,将 owed_change
的数据类型从 float 更改为 int
。那应该可以解决您的问题。