CS50 pset1 贪婪挑战

Posted

技术标签:

【中文标题】CS50 pset1 贪婪挑战【英文标题】:CS50 pset1 Greedy Challenge 【发布时间】:2017-07-04 12:17:05 【问题描述】:

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

我在编程方面是 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 &gt; 25 --> quantity &gt;= 25 0.25 得到什么输出? 1!马上解决了!非常感谢! 【参考方案1】:

问题在于您的第一个比较为(quantity &gt; 25)。当您有 23 美元的总金额时,您期望 23 * 4 = 92 coins

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

解决方法是(你现在应该已经猜到了)用(quantity &gt;= 25)替换那个检查

【讨论】:

哦,我明白了!!!!非常感谢@YePhIcK!我明白问题出在哪里。很温柔的解释!我真的很感激!【参考方案2】:
    #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");


【讨论】:

仅由代码组成的答案不是高质量的答案。请编辑您的帖子以说明您所做的更改以及更改原因。

以上是关于CS50 pset1 贪婪挑战的主要内容,如果未能解决你的问题,请参考以下文章

有奖竞猜ECLIPSE邀您一起挑战下一刻 开启电竞新纪元

牛客挑战赛 50

CS224W摘要18.Graph Neural Networks in Computational Biology

web前端开发面临的挑战主要是都有哪些?

干货第四届中间件性能挑战赛启动,50万奖金赛题分析重磅资料为你而来!

美团高校挑战赛|50万奖金池,“CTF+挖洞”双赛道……等你来!