using System;
using System.Diagnostics;
using System.IO;
namespace ekz
{
public class Program
{
static void Main(string[] args)
{
try
{
double bestSum = Solution.getBestSum(); // Сумма для вклада с максимальным доходом
Console.WriteLine(bestSum);
Console.WriteLine("Годовой доход " + Solution.bestTotalCapitalization);
using (StreamWriter streamWriter = new StreamWriter($"{Directory.GetCurrentDirectory()}/answer.txt"))
{
streamWriter.WriteLine($"Годовой доход равен {Solution.bestTotalCapitalization} с вкладом {bestSum}");
}
}
catch
{
Console.WriteLine("Возникла ошибка");
}
}
}
///
/// Решение
///
public class Solution // Класс с методами для решения
{
public static double bestTotalCapitalization; // Сумма наибольшей капитализации
///
/// Метод определения процентной ставки
///
/// Ставка
///
/// Процент
///
public static double getProcent(double N, double threeMonthAdd, double M) // Метод определения процентной ставки
{
// Диапозон вкладов
double minValue = 0;
double maxValue = 50000;
if (N < 700000) // При ставке, меньшей 700 тыс. у. е.
{
for (int i = 1; i <= (700000 / 50000); i++) // Определение процента по промежуткам
{
if (N >= minValue && N <= maxValue - 0.01)
{
M = i + threeMonthAdd; // Добавление к проценту
if (M > 20) M = 20;
break;
}
minValue += 50000;
maxValue += 50000;
}
}
else if (N == 700000) // При ставке, равной 700 тыс. у. е.
{
M = 20 + threeMonthAdd;
if (M > 20) M = 20;
}
else if (N > 700000) // При ставке, большей 700 тыс. у. е.
{
M = 20;
minValue = 700000;
maxValue = 750000.00;
for (int i = 0; i <= (700000 / 50000); i++)
{
if (N >= minValue && N <= maxValue - 0.01)
{
M = M - i;
M += threeMonthAdd;
if (M < 1) M = 1;
break;
}
minValue += 50000;
maxValue += 50000;
}
}
return M;
}
public static double getCapitalization(double M, double N) // Метод определения месячной капитализации
{
if (M - 8 > 5) // Если процентная ставка больше такой же в центр. банке на более чем 5 процентов
return ((N * (M / 100 / 12)) * 0.7);
else
return N * (M / 100 / 12);
}
public static double getBestSum() // Метод определения лучшего начального вложения
{
double bestSum = 0; // Лучшее начальное вложение
double max = 0; // Максимальная капитализация
try
{
Trace.Listeners.Add(new TextWriterTraceListener("debug.txt"));
for (int i = 0; i < 1000000; i += 1000)
{
double N = i;
double M = 8; // Процентная ставка
double capitalization;
double totalCapitalization = 0;
double threeMonthAdd = 0; // Сумма прибавки за каждый третий месяц
int monthesCount = 12; // Кол-во месяцев
for (int j = 1; j <= monthesCount; j++)
{
if (j % 3 == 0) threeMonthAdd += 0.5;
M = getProcent(N, threeMonthAdd, M);
capitalization = getCapitalization(M, N);
N += capitalization;
totalCapitalization += capitalization;
}
if (totalCapitalization > max) // Сравнение капитализаций
{
max = totalCapitalization;
bestSum = i;
}
Trace.WriteLine(i + "\nГодовой доход " + totalCapitalization);
}
Trace.Flush();
bestTotalCapitalization = max;
Debug.WriteLine("Подсчет суммы прошел успешно");
return bestSum;
}
catch
{
Debug.WriteLine("Возникли проблемы с подсчетом");
return 0;
}
}
}
}