首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CS50贪心算法

CS50贪心算法
EN

Stack Overflow用户
提问于 2017-02-01 21:03:35
回答 1查看 2.1K关注 0票数 0

我刚开始用cs50进行C编程。

我试着做关于贪婪算法的习题集,但似乎找不到bug。我的代码如下。

代码语言:javascript
运行
复制
#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在哪里。有谁可以帮我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.040.03这样的数字,您将看到计数停留在1。删除第一便士后,代码中断循环,使amount仍然大于0。break使我们更难发现代码何时会跳出循环,这就是为什么许多程序员建议尽可能避免这样做的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41980535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档