贪婪程序永远运行

时间:2017-03-14 23:49:06

标签: c cs50

我最近开发了一个简单的程序,旨在获取一定数量的金钱(以美元计)并确定满足该要求所需的最少数量的硬币。

#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作为浮点应该充当brew services start postgres 。如果是这样,我还做错了什么?

1 个答案:

答案 0 :(得分:3)

在你的情况下,用钱作为分数并将所有值乘以100会更好。原因是浮点数不是精确值;这就是为什么你的代码适用于浮点值(如0.25)的原因,但不适用于较小的浮点数,如0.1,0.05和0.01。为了您的目的,最好使用int值。

而不是:

  • 0.25 $,使用25美分
  • 0.10 $,使用10美分
  • 0.05 $,使用5美分
  • 0.01 $,使用1美分

进行上述更改后,将owed_change的数据类型更改为int。这应该可以解决你的问题。