实际的数学公式涉及C++代码
Actual math formula involved with C++ code
问题:
我正试图找到下面这个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;
}
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值