CS50贪心算法
CS50 greedy algorithm
我刚开始使用 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);
}
当我输入找零时,我得到了 8 个硬币。似乎无法找到错误所在。谁能帮帮我?
首先,您可以尝试 运行 您的程序使用 change
的值 return 简单的答案,例如 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.04
和 0.03
,您会看到计数停留在 1
。删除第一分钱后,代码跳出循环,留下 amount
仍然大于 0。break
使得代码跳出循环变得更难看清,这就是为什么许多程序员建议尽可能避免它。
我刚开始使用 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);
}
当我输入找零时,我得到了 8 个硬币。似乎无法找到错误所在。谁能帮帮我?
首先,您可以尝试 运行 您的程序使用 change
的值 return 简单的答案,例如 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.04
和 0.03
,您会看到计数停留在 1
。删除第一分钱后,代码跳出循环,留下 amount
仍然大于 0。break
使得代码跳出循环变得更难看清,这就是为什么许多程序员建议尽可能避免它。