Задача Ю3.5. Коммерция. Предприниматель, начав дело, взял кредит размером [latex]k[/latex] рублей, под [latex]p[/latex] процентов годовых и вложил его в своё дело. По прогнозам, его дело должно давать прибыль [latex]r[/latex] рублей в год. Сможет ли он накопить сумму, достаточную для погашения кредита, и если да, то через сколько лет?
[latex]k[/latex] | [latex]p[/latex] | [latex]r[/latex] | [latex]n[/latex] | Комментарий. |
1800 | 50 | 1000 | — | Кредит не будет погашен. |
800000 | 15 | 40000 | — | Кредит не будет погашен. |
1000 | 5 | 400 | 3 | Тест пройден. |
1500 | 3,5 | 400 | 5 | Тест пройден. |
Код программы (C++):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <stdio.h> #include <math.h> int main() { double p; // Для процентов определён тип дробных чисел. int k, n, r; // Для количества денег и лет определяем целочисленные значения. scanf ("%d %lf %d", &k, &p, &r); // Ввод данных с клавиатуры. for (n=1; (n*r)<(k*pow(1+(p/100), n)); n++) { if (k*pow(1+p/100, n)-k>=r) { puts ("You can't pay back a loan.\n"); return 0; } } printf ("%d\n", n); return 0; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { double p, n=1.0, r; int k; boolean f=false; Scanner in = new Scanner (System.in); k=in.nextInt(); p=in.nextDouble(); r=in.nextDouble(); for (; (n*r)<(k*Math.pow(1+(p/100), n)); n++) { if (k*Math.pow(1+p/100, n)-k>=r) { System.out.println ("You can't pay back a loan."); f=true; break; } } if (f==false) { System.out.format ("%d%n", (int)n); } } } |
По условию задачи необходимо определить, сможет ли должник накопить сумму, достаточную для погашения кредита, и если да, то через сколько лет.
Изначально запускается цикл, который основан на сравнении дохода за несколько лет [latex]nr[/latex] и размера кредита, которого он достигнет за эти годы (вычисляется по формуле сложных процентов: [latex]k(1+\frac{p}{100})^{n}[/latex]).
Затем программа проверяет, как возрастают доходы и долг за год. Если скорость роста доходов не превышает скорость роста долга, то программа выдаёт ошибку, или «кредит не будет погашен», после чего возвращается 0 и программа считается успешно завершённой. В противном случае цикл повторяется, а по его окончании на экран выводится количество лет, за которые долг можно будет погасить.
Проверить код можно здесь (C++) и здесь (Java).
Размера кредита ведь у Вас «вычисляется по формуле сложных процентов» , т.е. чем дальше тем быстрее растет, а доход стабилен. Тем не менее, условие «скорость роста доходов превышает скорость роста долга» проверяется только один раз, но потом ведь скорость роста долга может превысить скорость роста доходов, долг предприниматель так и не выплатит, а Ваша программа зациклится.
Спасибо большое за замечание, сначала не обратила на это внимания.
Проблема исправлена, также я несколько отредактировала формулы.
Засчитано, 10 баллов.
Вместо f==false лучше написать !f, да и переменную лучше назвать более осмысленно, например canPay. Конечно, понимаю, что k, p, r то же не очень осмысленные названия — но они соответствуют обозначениям в исходной математической постановке задачи, так что тут все претензии даже не к Юркину, а к математикам, которые привычно используют однобуквенные обозначения для переменных.
И уж если говорить о стиле, то не согласен с тем, что Вы вынесли присваивание числа n из цикла (определение — согласен, но присвоить можно и в цикле). И вообще то количество лет может быть только целым — неужели в Java есть проблемы, если n будет типа int?