CS50 PSet 1 贪婪

CS50 PSet 1 Greedy

我正在编写一个程序,接受输入并打印出使用的最少数量的硬币。当我 运行 程序并输入输入时,它没有按预期工作并且不打印任何内容。我在这里做错了什么?

#include <stdio.h>
#include <cs50.h>

int main (void)
{
    float f = 0;
        int count = 0;//number of coins
        do 
        {
            printf("How much change is owed?\n");
            f = GetFloat();
        }
        while (f < 0);

    //Convert to cents
        f = f * 100;
        while (f > 0)
        {
            if (f > 25)
            {
                    f = f - 25;
                    count++;
            }
            else if (f > 10)
            {
                    f = f - 10;
                    count++;
            }
            else if (f > 5)
            {
                    f = f - 5;
                    count++;
            }
            else if (f > 1)
            {
                    f = f - 1;
                    count++;
            }
        }
        printf("%d", count);
}

It doesn't print anything

问题是程序陷入了死循环。最初,f=0.41。然后,你做 f = f * 100;我们有 f = 41.

然后,当您在循环中移动时,

首先,f>25,所以 f = f - 25,你得到 f = 16

然后,下一次迭代,f>10,所以 f = f - 10,你得到 f = 6

然后,f>5,所以 f = f - 5,你得到 f = 1

现在,循环中的none个if条件都满足了,但是while中的条件仍然为真。所以,它永远不会爆发。要更正此问题,请将 if 块中的所有 > 符号替换为 >=。这将为您提供正确数量的硬币。 (但你必须确保 ff = f * 100 之后没有任何小数部分)。

 f = (int)(f * 100);
        while (f > 0)
        {
            if (f >= 25)
            {
                    f = f - 25;
                    count++;
            }
            else if (f >= 10)
            {
                    f = f - 10;
                    count++;
            }
            else if (f >= 5)
            {
                    f = f - 5;
                    count++;
            }
            else if (f >= 1)
            {
                    f = f - 1;
                    count++;
            }
        }

你的程序永远不会在 f 的值变为 1 后结束。将 '>' 符号替换为 '>=' 符号