Наименование векселей с использованием оператора модуля С ++

0

Пожалуйста, помогите мне! Кажется, в моей программе c++ есть ошибка. Код показывает неправильный вывод о номиналах, заданный как ввод целочисленной суммы в песо. Напишите программу, в которой будет отображаться число 1000, 500, 100, 50, 20 и 10 песо. Выведите также оставшуюся сумму после удаления всех купюр.

И это мой программный код.

#include <iostream>

using namespace std;

int main()
{
    int a;
    cout << "Enter the amount: ";
    cin  >> a;

    cout << "No. of 1000 peso bills:  "  << a/1000;
    cout << "\nNo. of 500  peso bills:  "  << a%1000/500;
    cout << "\nNo. of 100  peso bills:  "  << a%500/100;
    cout << "\nNo. of 50   peso bills:  "  << a%100/50;
    cout << "\nNo. of 20   peso bills:  "  << a%50/20;
    cout << "\nNo. of 10   peso bills:  "  << a%20/10;
    cout << "\n\nThe rest of the amount: " << a%10;
}

Результат показывает:

Enter the amount: 34757
No. of 1000 peso bills:  34
No. of 500  peso bills:  1
No. of 100  peso bills:  2
No. of 50   peso bills:  1
No. of 20   peso bills:  0
No. of 10   peso bills:  1

The rest of the amount: 7

Process returned 0 (0x0)   execution time : 2.156 s
Press any key to continue.

Количество 10 песо должно быть 0 вместо 1, Как я могу предположить, чтобы исправить это? Заранее спасибо.

Теги:
modulus

2 ответа

2

Проблема в математике. Поскольку 50 не кратно 20, вам нужно исправить расчет для 10 pesos-счетов:

(a%50-(a%50)/20*20)/10;

Это, конечно, только решение для этого конкретного случая. В общем, если у вас есть другие счета, все сложнее. В вашем случае вам просто повезло, потому что большинство счетов является точным кратным всем меньшим счетам, где единственная исключение составляет 50/20-пара.


Более общее и читаемое решение, вдохновленное другим ответом:

#include <iostream>
using namespace std;

int main()
{
    int a;
    cout << "Enter the amount: ";
    cin  >> a;

    cout << "No. of 1000 peso bills:  "  << a/1000;
    cout << "\nNo. of 500  peso bills:  "  << (a%=1000)/500;
    cout << "\nNo. of 100  peso bills:  "  << (a%=500)/100;
    cout << "\nNo. of 50   peso bills:  "  << (a%=100)/50;
    cout << "\nNo. of 20   peso bills:  "  << (a%=50)/20;
    cout << "\nNo. of 10   peso bills:  "  << (a%=20)/10;
    cout << "\n\nThe rest of the amount: " << a%10;
}
1

Один из способов устранить проблему - это уменьшение суммы, которую вы уже указали с большими счетами из общей суммы, например:

cout << "No. of 1000 peso bills:  "  << a/1000;
a %= 1000;
cout << "\nNo. of 500  peso bills:  "  << a%1000/500;
a %= 500;
cout << "\nNo. of 100  peso bills:  "  << a%500/100;
a %= 100;
cout << "\nNo. of 50   peso bills:  "  << a%100/50;
a %= 50;
cout << "\nNo. of 20   peso bills:  "  << a%50/20;
a %= 20;
cout << "\nNo. of 10   peso bills:  "  << a%20/10;
a %= 10;
cout << "\n\nThe rest of the amount: " << a;

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

Демо на идеон.

  • 0
    +1 Для более общего решения я добавил упрощенную версию его в свой ответ.

Ещё вопросы

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