C ++ возможные комбинации монет с использованием цикла while

0

У меня есть проблема в моем классе программирования, где мы должны использовать функцию void для вычисления возможных комбинаций монет с заданным значением изменения от 1 до 99 центов.

Пока мой код выглядит так:

    #include <iostream>

using namespace std;

void computeCoins(int coinValue, int& num, int& amount_left);

int main()
{
    //Define varibles then get user input for change
    int leftOver, quarters=0, dimes=0, nickels=0, pennies=0, coins=0, originalAmount;
    do
    {
    cout << "Enter change amount: ";
    cin >> originalAmount;
    leftOver = originalAmount;
    } while ((leftOver > 99) || (leftOver < 1)); //Larger than 99 or smaller than 1? If yes, then try again.

    //Quarters
    computeCoins(25, coins, leftOver);
    quarters = coins;

    //Dimes
    computeCoins(10, coins, leftOver);
    dimes = coins;

    //Nickels
    computeCoins(5, coins, leftOver);
    nickels = coins;
    pennies = leftOver;

    cout << originalAmount << " cent/s could be given as " << quarters << " quarter/s, " << dimes << " dime/s, " << nickels << " nickel/s, " << " and " << pennies << " pennies.";
    cout << endl;
    system("PAUSE");
    return 0;
}

void computeCoins(int coinValue, int& num, int& amount_left)
{
    //Using the specified coin value, find how many can go into it then subtract it
    while (amount_left % coinValue == 0)
    {
        // Still dividable by the coin value
        num += 1;
        amount_left -= coinValue;
    }
}

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

Теги:
loops
while-loop

2 ответа

2
Лучший ответ

Два вопроса: одно неопределенное первоначальное значение монет. Два amount_left % coinValue == 0 часть - я думаю, вы имеете в виду amount_left >= coinValue

Хотя нет необходимости продолжать итерацию в этой функции

void computeCoins(int coinValue, int& num, int& amount_left)
{
    // add as many coinValues as possible.    
    num += amount_left / coinValue;
    // the modulus must be what is left.
    amount_left = amount_left % coinValue;
}

Обратите внимание, что (среди прочего) вам будет лучше использовать unsigned ints для количества вещей.

  • 0
    Не берите в голову, это фактически исправило это. Я должен действительно думать больше "бритвы Оккама" с этого момента.
  • 0
    Не требуется - поскольку вы делите целые числа, стандарт C говорит, что результат всегда будет округляться до 0.
Показать ещё 2 комментария
0

Когда я прочитал ваш вопрос, кажется, вы должны искать способ получить все возможные комбинации. Ответ Оливера Мэтьюза обрабатывает первую часть этого (выясняя, сколько из данного типа монеты вы можете вписать в изменение), но вам нужно будет сделать это в цикле, который проверяет различные другие комбинации (например, все гроши, все никели с копейки, все копейки с копейки, все кварталы с пенни и т.д.) и нужен метод для возврата комбинаций (например, вернуть вектор некоторой структуры/класса, который обрабатывает количество монет по выходному параметру - это является вектором по ссылке).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню