123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- 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("Возникла ошибка");
- }
- }
- }
- /// <summary>
- /// Решение
- /// </summary>
- public class Solution // Класс с методами для решения
- {
- public static double bestTotalCapitalization; // Сумма наибольшей капитализации
- /// <summary>
- /// Метод определения процентной ставки
- /// </summary>
- /// <param name="N">Ставка</param>
- /// <param name="threeMonthAdd"></param>
- /// <param name="M">Процент</param>
- /// <returns></returns>
- 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);
- }
- }
- }
-
- }
|