числовой — фактическая математическая формула, связанная с кодом C ++

Вопрос:

Я пытаюсь найти математическую формулу, используемую в сочетании с этим кодом 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

0

Решение

Математика за этим занимается сложный процент как:

… В конце каждого месяца ежемесячная процентная ставка применяется к
непогашенный остаток и проценты добавляются к общей сумме
остаток средств. Любой произведенный платеж будет применен к балансу в
следующий месяц …

Таким образом, существует огромный объем работы, посвященной пониманию этого. У Википедии есть отличное:

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

Подсказка: Обратите особое внимание на раздел о ежемесячной оплате.

0

Другие решения

Я думаю, что большая сложность заключается в намеренно запутанных именах переменных. Вот код с читаемыми именами:

#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;
}
0

По вопросам рекламы [email protected]