Жадный алгоритм CS50

Я только начал программировать на C с 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 монет. Не могу найти где баг. Может кто-нибудь помочь мне?


person Xavier Tan    schedule 01.02.2017    source источник
comment
вы проверили CS50?   -  person Sourav Ghosh    schedule 01.02.2017
comment
>= 25 --› >= 0 и так далее. или просто (amount-25) >= 25 --› amount >= 25   -  person BLUEPIXY    schedule 01.02.2017


Ответы (1)


Во-первых, вы можете попробовать запустить свою программу со значениями для 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.04 и 0.03, вы увидите, что счет застрял на 1. После удаления первой копейки код выходит из цикла, оставляя amount по-прежнему больше 0. breaks затрудняют определение выхода кода из цикла, поэтому многие программисты рекомендуют по возможности избегать его.

person Tiago Alves    schedule 02.02.2017
comment
большое спасибо за подробные ответы, очень мне помогли. - person Xavier Tan; 04.02.2017