实际的数学公式涉及C++代码

Actual math formula involved with C++ code

本文关键字:C++ 代码 数学公式      更新时间:2023-10-16

问题:

我正试图找到下面这个C++代码所使用的数学公式。我正试着用手计算答案。我发现了涉及对数的公式,但下面什么都没有。他们提供的解决方案似乎与我的答案不符。任何见解都值得赞赏。


以下代码是ACM区域编程竞赛问题的解决方案:

使用信用卡购物很方便,但如果你没有每月全额支付余额,信用卡的利率会很高。利率通常以"年利率"(APR(的形式报价,然后每月将其应用于未偿余额。APR可以转换为月利率R。每个月底,月利率应用于未偿余额,利息添加到总余额中。所支付的任何款项都将用于下个月的余额。在计算中,月利息四舍五入至最接近的美分(四舍五舍五入0.5美分及以上(。不幸的是,你在月底积累了一笔未付余额B,你每月只能支付M。如果你不再使用信用卡购物,那么完全消除未偿余额所需的最低付款次数是多少?你可能无法在100年内付清余额(1200笔付款(。输入输入由多个测试用例组成。第一行输入是一个整数,不超过1000,表示要遵循的测试用例的数量。以下每一行都指定了一个案例的输入。每行包含三个用单空格分隔的正实数:R、B和M。实数在小数点后有两位,满足R 50.00和B,M 50000.00。R是月利率,以百分比表示。输出对于每种情况,在行上显示消除未清余额所需的最低付款次数。如果在最多1200笔付款中无法做到这一点,那么打印就不可能了。

代码:

#include <iostream>
using namespace std;
const double eps = 1e-8;
const double max_b = 50000;
const int max_payments = 1200;
int main()
{
    int tn;
    for (cin >> tn; tn--;)
    {
        double r, b, m;
        cin >> r >> b >> m;
        int minnum = 0;
        double pb = max_b + 1;
        while (b > 0 && minnum++ <= max_payments && b < pb)
        {
            pb = b;
            b *= (1 + r / 100.0);
            b = (int)(b * 100 + 0.5 + eps) / 100.0;
            b -= m;
        }
        if (minnum > max_payments || b >= pb)
            cout << "impossible" << endl;
        else
            cout << minnum << endl;
    }
    return 0;
}

====================

样本输入

11
2.00 100.00 105.00
2.00 100.00 102.00
2.00 100.00 100.00
2.00 100.00 4.00
2.00 100.00 3.00
2.00 100.00 1.00
2.00 100.00 2.00
9.56 5462.50 522.22
12.50 29876.44 33610.99
5.50 1.00 1.05
14.78 40181.09 46119.86

样本输出

1
1
2
36
56
impossible
impossible
impossible
2
2
1

这背后的数学处理复利为:

在每个月底,月利率适用于未偿余额和利息加在总额中均衡任何付款将应用于下个月。。。

因此,有大量的工作致力于理解这一点。维基百科有一个很棒的:

http://en.wikipedia.org/wiki/Compound_interest

提示:请特别注意每月付款部分

我认为很大的困难在于故意混淆变量名。以下是可读名称的代码:

#include <iostream>
using namespace std;
const double epsilon = 1e-8;
const double max_balance = 50000;
const int max_payments = 1200;
int main()
{
    int totalNumberOfCases;
    for (cin >> totalNumberOfCases; totalNumberOfCases--;)
    {
        double rate, balance, maxMonthlyPayment;
        cin >> rate >> balance >> maxMonthlyPayment;
        int minMonthsToPayoff = 0;
        double previousBalance = max_balance + 1;
        while (balance > 0 && minMonthsToPayoff++ <= max_payments && balance < previousBalance)
        {
            previousBalance = balance;
            balance *= (1 + rate / 100.0);
            balance = (int)(balance * 100 + 0.5 + epsilon) / 100.0;
            balance -= maxMonthlyPayment;
        }
        if (minMonthsToPayoff > max_payments || balance >= previousBalance)
            cout << "impossible" << endl;
        else
            cout << minMonthsToPayoff << endl;
    }
    return 0;
}