【问题标题】:CS50 PSet 1 GreedyCS50 PSet 1 贪心
【发布时间】:2016-11-22 14:08:49
【问题描述】:

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

#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 是一个浮点数(在循环结束时打印 f 的浮点值)
  • 要转换成美分,最好四舍五入到最接近的整数f = rintf(f * 100);f = roundf(f * 100);
  • 因为f 是一个浮点数,所以所有值也应该是浮点数。 IE。 100 应该是 100.f 等等等等
  • 所需的零钱可能远远超过 99 美分,因此计算应包括 100、60、20、10、5 和 1 美元的钞票加上 50 美分的钞票。为了使输出更有意义,强烈建议跟踪每种找零钞票或硬币的计数并输出这些计数

标签: c cs50


【解决方案1】:

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

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

首先是f&gt;25,然后是f = f - 25,然后你会得到f = 16

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

然后,f&gt;5,所以f = f - 5,你得到f = 1

现在,循环中的 if 条件都不满足,但 while 中的条件仍然为真。所以,它永远不会爆发。要更正此问题,请将 if 块中的所有 &gt; 符号替换为 &gt;=。这将为您提供正确数量的硬币。 (但您必须确保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++;
            }
        }

【讨论】:

  • 啊!不敢相信我忽略了这一点。非常感谢你的帮助。欣赏它:D
  • (int)f = (int)(f * 100); 中存在许多问题,尤其是截断。最好使用rintf()roundf() 进行舍入。
【解决方案2】:

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

【讨论】:

  • 虽然我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为另一个用户已经发布了该解决方案。如果之前的答案对您有帮助,您应该投票而不是重复相同的信息。
  • 对不起,我只是想获得一些声誉,因为我是 stackoverflow 的新手并且对任何编程语言都没有太多了解。你能建议一些好的步骤来让我赢得一些声誉吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多