2017-02-01 123 views
0

我刚刚开始用cs50编程。CS50贪婪算法

我试图做的关于贪婪算法的问题集,但似乎无法找到该错误。我的代码如下。

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


int main (void) 
{ 

int count = 0; 

printf("how much is the change?: "); 

float change = get_float(); 

while(change < 0) 
{ 
    printf("change is to be more than 0"); 
    change = get_float(); 
} 

int amount = lroundf(change*100); 

while(amount > 0) 
{ 
    if ((amount-25) >= 25) 
    { 
     amount = amount - 25; 
     count++; 
    } 

    else if ((amount-10) >= 10) 
    { 
     amount = amount - 10; 
     count++; 
    } 

    else if ((amount-5) >= 5) 
    { 
     amount = amount -5; 
     count++; 
    } 

    else if((amount-1) >= 1) 
    { 
     amount = amount -1; 
     count ++; 
     break; 
    } 

    else 
    { 
    printf("you have no change \n"); 
    } 
    } 
    printf("your number of coins is %i\n", count); 

    } 

当我输入我的更改为1时,我收回了8个硬币。似乎无法找到错误所在。谁能帮我?

+2

你检查过[cs50.se]吗? –

+2

'> = 25' - >'> = 0'等等。或简单地'(金额-25)> = 25' - >'金额> = 25' – BLUEPIXY

回答

0

首先,您可以尝试使用change的值运行程序,该值返回简单的答案,如1枚硬币,例如使用change = 0.25。如果这样做,那么你应该开始尝试用几个硬币,重复一种类型,就像你做1.00,或加入几种类型,如0.06。之后,尝试使用浮动不准确度较高的大数字和值,如4.10。在此之后应该引导你回答你的答案。

如果在尝试之后,仍然无法找到问题,则下面是答案:问题与if/else if表达式有关。例如,当您尝试计算宿舍时,(amount-25) >= 25无法正常工作。 amount大于或等于25,但您的代码只是这样做,直到它小于50为止。开发您的表达式可能会帮助您看到它:(amount-25) >= 25 - >(amount-25) + 25 >= 25 + 25 - >amount >= 50

您可能发现的另一个问题是与break声明有关。它可能比预期的早出现。如果您尝试运行0.040.03之类的号码,则会看到计数停留在1。删除第一个分钱后,代码突破循环而使amount仍然大于0. break s使代码更难以看清代码何时退出循环,这就是为什么许多程序员建议尽可能避免它。

+1

非常感谢你的详细解答,帮助了我很多。 –