CS50 pset1 贪心挑战

CS50 pset1 Greedy Challenge

在这里问这个愚蠢的问题我有点惭愧,但事实是,我已经尝试了所有方法,仍然看不出错误在哪里。

我在编程方面是 101% 的菜鸟,而且我已经注册了 CS50。我正在努力从中获得最好的结果,所以我总是接受不太舒服的挑战,以便尝试和学习最多。

我已经完成了 CS50 的 pset1 中贪婪挑战的代码。我竭尽全力让它尽可能好、干净和简单,但每次检查我的代码时,我总是收到一个错误提示。

特此附上代码检查和我的代码:

通过 CS50 终端脚本检查的代码:

:) greedy.c exists :) greedy.c compiles :) input of 0.41 yields output of 4 :) input of 0.01 yields output of 1 :) input of 0.15 yields output of 2 :) input of 1.6 yields output of 7 :( input of 23 yields output of 92 \ expected output, but not "94\n" :) input of 4.2 yields output of 18 :) rejects a negative input like -.1 :) rejects a non-numeric input of "foo" :) rejects a non-numeric input of ""

这是我的代码:

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

float change;

int coins = 0;
int quantity;

int main (void)
{
do 
{
    printf("O hai! How much change is owed?\n");
    change = get_float();
}
while (change < 0);



//converting float change (dollars) into integer change (cents)

 quantity = round(change * 100.00);



while (quantity > 25) //This runs as long as quantity left is bigger than a quarter coin
{
    quantity -= 25;
    coins++;
}
while (quantity >= 10) //This runs as long as quantity left is bigger than a dime coin
{
    quantity -= 10;
    coins++;
}
while (quantity >= 5) //This runs as long as quantity left is bigger than a nickel coin
{
    quantity -= 5;
    coins++;
    }
while (quantity >= 1) //This runs as long as quantity left is bigger than 0
{
    quantity -= 1;
    coins++;
}


printf("%i\n", coins);
}`

免责声明:我想指出,我完全了解哈佛的诚信准则。我并不是要为问题找到一个简单的解决方案,而只是摆脱这个挑战。

我希望有人花时间写下解释,启发我并帮助我理解我的代码失败的原因。 我不寻求任何答案,如果你不喜欢,你也不必指出。 我只是一个没有经验的 CS 初学者,愿意阅读你所有的答案,并最终理解为什么一些应该有效的东西根本不起作用。

非常感谢您的耐心等待!

问题出在您的第一个比较 (quantity > 25) 中。当您的总金额为 23 美元时,您期望 23 * 4 = 92 coins.

但是,当您减去这些季度中的 91 个时,您最终得到 (quantity == 25) 并且检查失败(因为 quantity 不再 严格更大 25 但等于它),将您推入 2 角,然后进入最后一个镍币,使其显示为 94 个硬币。

解决方法是(您现在应该已经猜到了)用 (quantity >= 25)

替换该检查
    #include <stdio.h>
    #include <cs50.h>
    #include <math.h>

    float change; // change can be float

    int amount;

    int coins = 0;

    int main(void)
   {

       do
       {
           change = get_float ("Change owed: ");
       }
       while(change < 0);

       amount = round(change * 100);

       while( amount >= 25)
      {
           amount -= 25;//This is the end of loop substract until it reaches to the 
           //25 or less
           coins ++;// this is the count of coins that how many owned coins will 
           //become big bite
       }

       while(amount >= 10)
       {
           amount -= 10;
           coins ++;
       }

       while(amount >= 5)
       {
           amount-=5;
           coins++;
       }
       while(amount >= 1)
       {
       amount -= 1;
       coins++;
   }

   printf("The minimum number of coins that is to be used is: %i",coins);//the minimum number of coins
   printf(" coins.");
   printf("\n");

}