заставить жадный алгоритм работать для каждого ввода

#c #cs50

#c #cs50

Вопрос:

Я написал код для жадного алгоритма cs50. Он работает для входных данных от 0 до 1. Как я могу заставить его работать с такими входными данными, как 4.2, 6.5, 8 и т.д.?. Я перечислил свой код ниже. Что я должен изменить в программе?

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

int main()
{
    int count , change;
    float cents;
    printf("Enter the change amount : ");
    cents = GetFloat();
    cents = cents * 100;
    change = round(cents);
    count = 0;

    while(cents < 0 )
    {
        printf("Enter a positive number : ");
        cents = GetFloat();
    }

    while (change >= 25)
    {
        change = change - 25;
        count  ;
    }

    while (change < 25 amp; change >= 10)
    {
        change = change - 10;
        count  ;
    }
    while (change < 10 amp; change >= 5)
    {
        change = change - 5;
        count  ;
    }
    while (change < 5 amp; change >= 1)
    {
        change = change - 1;
        count  ;
    }

    printf("Total number of coins used : " );
    printf (" %d " ,  count );
    printf("n");

}
  

Комментарии:

1. Было бы неплохо получить немного больше информации. Что должна делать программа? Как он ведет себя с вводом 4.2? Как он должен себя вести? Как вы пытались это исправить до сих пор?

2. printf("Enter a positive number : "); cents = GetFloat(); требуется обновление change .

3. Что ожидается на выходе, когда ввод равен 4.2?

4. Предполагается, что программа возвращает минимальное количество монет для изменения. Например, если я должен получить сдачу в размере 75 центов, я бы ввел 0,75, а поскольку 25 центов 25 центов 25 центов равно 75 центам, он вернет 3 монеты. Он работает одинаково для всех чисел от 0 до 1. Если я введу 2.5, он должен позаботиться только о 0.5, то есть он должен вернуть 2 монеты, поскольку две четверти составляют 0,5 цента. Но вместо этого он возвращает 10. Когда я ввожу 4.2, он должен отбросить 4 и взять 0,2, что составляет 20 центов, и вернуть 2 монеты, поскольку две десятицентовики составляют 20 центов. Но он возвращает 18.

5. На самом деле это не жадный алгоритм, потому что всегда есть заметный лучший ответ.

Ответ №1:

Я считаю, что ваша проблема в том, что вы используете побитовые логические операторы. Вы должны использовать amp;amp; в своих сравнениях для сравнения значений двух выражений. Есть и другие небольшие проблемы: цикл, который гарантирует положительный ввод, должен умножаться cents на 100 и round() , прежде чем присваивать это новое значение для изменения. Но на самом деле вам не нужны оба change и cents . И вам не нужно столько сравнений, сколько вы написали, и без дополнительных сравнений вам не нужны логические операторы, которые в первую очередь вызывали у вас проблемы!

Редактировать

Я заметил, что сначала округляется число, подобное 4.20 , а затем умножается на 100! Конечно, это неправильно, давая те же результаты для 4.20 , 4.75 , и 4 . Я соответствующим образом изменил приведенный ниже код, но ваш исходный код выполнял эту часть правильно (за исключением цикла проверки ввода, как упоминалось ранее). Теперь программа корректно обрабатывает такие входные данные.

Вот очищенная версия (у меня нет cs50.h библиотеки, поэтому есть некоторые небольшие отличия):

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

int main(void)
{
    int count;
    float cents;

    printf("Enter the change amount: ");
    scanf("%f", amp;cents);
    cents = (float)round(cents * 100);
    count = 0;

    while (cents < 0) {
        printf("Enter a positive number: ");
        cents = (float)round(cents * 100);
    }

    while (cents >= 25) {
        cents -= 25;
        count  ;
    }
    while (cents >= 10) {
        cents -= 10;
        count  ;
    }
    while (cents >= 5) {
        cents -= 5;
        count  ;
    }
    while (cents >= 1) {
        cents -= 1;
        count  ;
    }

    printf("Total number of coins used: %dn", count);

    return 0;
}
  

Комментарии:

1. @Jay Jay — вы должны увидеть редактирование кода в моем ответе. Теперь он правильно обрабатывает числа с дробными частями.