【问题标题】:Denomination of bills using c++ modulus operator使用 C++ 模运算符的票据面额
【发布时间】:2013-10-06 12:28:49
【问题描述】:

请帮帮我!我的 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,我该如何纠正这个问题?提前致谢。

【问题讨论】:

  • 找出如何解决一个更简单的例子,例如a == 50.

标签: c++ modulus operation


【解决方案1】:

问题在于数学。由于 50 不是 20 的倍数,因此您需要修正 10 比索钞票的计算:

(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;
}

【讨论】:

    【解决方案2】:

    解决问题的一种方法是从总额中删除您已经用较大的账单代表的金额,如下所示:

    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;
    

    这将模拟进行更改的过程,当您收到较小的账单时,将您已经提供较大账单的金额从考虑中移除。

    Demo on ideone.

    【讨论】:

    • +1 对于更通用的解决方案,我在答案中添加了它的简化版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多