Жадный алгоритм в C не возвращает никаких значений? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь написать жадный алгоритм с вводом, который должен возвращать наименьшее количество монет, которые будут использоваться в изменении, но он не возвращает никаких значений. Я не уверен почему. Он просто запрашивает ввод, затем ничего не отображает.

Я создал предыдущий поток, в котором была обнаружена ошибка, которая привела к бесконечному циклу, который был сжат, но теперь, похоже, в моей логике есть еще одна ошибка.

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

// declare variable change_owed, num_coins, and input globally
float change_owed = 0;
float input;
int num_coins;

int main(void)
{
    // makes sure the input is non-negative
    do
    {
        input = get_float("Amount paid\n");
    }
    while(input <=0);

    // begin checking 
    while(input > 0)
    {
        if(input - .25 >= 0) // quarters
        {
            num_coins++; // number of coins used, to be printed later, is incremented
            input = input - .25; // coin is subtracted from total
        }
        if (input - .10 >= 0) // dimes
        {
            num_coins++;
            input = input - .10;
        }   
        if (input - .05 >= 0) // nickels
        {
            num_coins++;
            input = input - .05;
        } 
        if (input - .01 >= 0) // pennies
        {
            num_coins++;
            input = input - .01;
        } 
    }
    printf("%i", num_coins);
}

1 Ответ

5 голосов
/ 16 мая 2019

В обычно используемом формате для double, .10 - это не 0,10, а 0,100000001490116119384765625. Кроме того, вы используете float переменные (float input) с double константами (.10, .05, .01). В какой-то момент ваша программа имеет оставшуюся сумму денег, такую ​​как .00999… 5, которая меньше копейки, поэтому у нее нет монеты, чтобы вычесть из нее, поэтому код зацикливается навсегда, ничего не вычитая. Чтобы исправить это, как только вы получите input, умножьте его на 100, округлите до ближайшего целого числа (как с int cents = roundf(input * 100);) и используйте целочисленную арифметику для остальных вычислений.

Как только вы это сделаете, ваша программа начнет давать результаты, и вам нужно будет переосмыслить имеющиеся у вас структуры while и if, как упоминалось в некоторых комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...