我刚开始用cs50进行C编程。
我试着做关于贪婪算法的习题集,但似乎找不到bug。我的代码如下。
#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个硬币。似乎找不到bug在哪里。有谁可以帮我?
发布于 2017-02-03 01:40:03
首先,您可以尝试使用返回简单答案的change
值运行您的程序,例如,使用change = 0.25
。如果这有效,那么你应该开始尝试一些硬币,重复一种类型,就像你对1.00
所做的那样,或者加入几种类型,比如0.06
。在此之后,尝试使用较大的数字和具有较高浮点数不准确性的值,如4.10
。遵循这一点应该会让你找到答案。
如果在尝试之后仍然找不到问题所在,那么答案是:问题出在if
/else if
表达式上。例如,当您试图计算25美分时,(amount-25) >= 25
不能正常工作。当amount
大于或等于25时,您试图去掉四分之一,但是您的代码只是这样做,直到它小于50。开发表达式可能会帮助您理解它:(amount-25) >= 25
-> (amount-25) + 25 >= 25 + 25
-> amount >= 50
。
您可能会发现的另一个问题是break
语句。它可能会比预期的更早地退出循环。如果您尝试运行像0.04
和0.03
这样的数字,您将看到计数停留在1
。删除第一便士后,代码中断循环,使amount
仍然大于0。break
使我们更难发现代码何时会跳出循环,这就是为什么许多程序员建议尽可能避免这样做的原因。
https://stackoverflow.com/questions/41980535
复制相似问题