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; } } } using Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestProject3 { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { double M = 10; double N = 100; double expected = N * (M / 100 / 12); double actual = ekz.Solution.getCapitalization(M, N); Assert.AreEqual(expected, actual); } [TestMethod] public void TestMethod2() { double M = 10; double N = 100; double expected = 102; double actual = ekz.Solution.getCapitalization(M, N); Assert.AreEqual(expected, actual); } } } }