ekz.txt 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. namespace ekz
  5. {
  6. public class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. try
  11. {
  12. double bestSum = Solution.getBestSum(); // Сумма для вклада с максимальным доходом
  13. Console.WriteLine(bestSum);
  14. Console.WriteLine("Годовой доход " + Solution.bestTotalCapitalization);
  15. using (StreamWriter streamWriter = new StreamWriter($"{Directory.GetCurrentDirectory()}/answer.txt"))
  16. {
  17. streamWriter.WriteLine($"Годовой доход равен {Solution.bestTotalCapitalization} с вкладом {bestSum}");
  18. }
  19. }
  20. catch
  21. {
  22. Console.WriteLine("Возникла ошибка");
  23. }
  24. }
  25. }
  26. /// <summary>
  27. /// Решение
  28. /// </summary>
  29. public class Solution // Класс с методами для решения
  30. {
  31. public static double bestTotalCapitalization; // Сумма наибольшей капитализации
  32. /// <summary>
  33. /// Метод определения процентной ставки
  34. /// </summary>
  35. /// <param name="N">Ставка</param>
  36. /// <param name="threeMonthAdd"></param>
  37. /// <param name="M">Процент</param>
  38. /// <returns></returns>
  39. public static double getProcent(double N, double threeMonthAdd, double M) // Метод определения процентной ставки
  40. {
  41. // Диапозон вкладов
  42. double minValue = 0;
  43. double maxValue = 50000;
  44. if (N < 700000) // При ставке, меньшей 700 тыс. у. е.
  45. {
  46. for (int i = 1; i <= (700000 / 50000); i++) // Определение процента по промежуткам
  47. {
  48. if (N >= minValue && N <= maxValue - 0.01)
  49. {
  50. M = i + threeMonthAdd; // Добавление к проценту
  51. if (M > 20) M = 20;
  52. break;
  53. }
  54. minValue += 50000;
  55. maxValue += 50000;
  56. }
  57. }
  58. else if (N == 700000) // При ставке, равной 700 тыс. у. е.
  59. {
  60. M = 20 + threeMonthAdd;
  61. if (M > 20) M = 20;
  62. }
  63. else if (N > 700000) // При ставке, большей 700 тыс. у. е.
  64. {
  65. M = 20;
  66. minValue = 700000;
  67. maxValue = 750000.00;
  68. for (int i = 0; i <= (700000 / 50000); i++)
  69. {
  70. if (N >= minValue && N <= maxValue - 0.01)
  71. {
  72. M = M - i;
  73. M += threeMonthAdd;
  74. if (M < 1) M = 1;
  75. break;
  76. }
  77. minValue += 50000;
  78. maxValue += 50000;
  79. }
  80. }
  81. return M;
  82. }
  83. public static double getCapitalization(double M, double N) // Метод определения месячной капитализации
  84. {
  85. if (M - 8 > 5) // Если процентная ставка больше такой же в центр. банке на более чем 5 процентов
  86. return ((N * (M / 100 / 12)) * 0.7);
  87. else
  88. return N * (M / 100 / 12);
  89. }
  90. public static double getBestSum() // Метод определения лучшего начального вложения
  91. {
  92. double bestSum = 0; // Лучшее начальное вложение
  93. double max = 0; // Максимальная капитализация
  94. try
  95. {
  96. Trace.Listeners.Add(new TextWriterTraceListener("debug.txt"));
  97. for (int i = 0; i < 1000000; i += 1000)
  98. {
  99. double N = i;
  100. double M = 8; // Процентная ставка
  101. double capitalization;
  102. double totalCapitalization = 0;
  103. double threeMonthAdd = 0; // Сумма прибавки за каждый третий месяц
  104. int monthesCount = 12; // Кол-во месяцев
  105. for (int j = 1; j <= monthesCount; j++)
  106. {
  107. if (j % 3 == 0) threeMonthAdd += 0.5;
  108. M = getProcent(N, threeMonthAdd, M);
  109. capitalization = getCapitalization(M, N);
  110. N += capitalization;
  111. totalCapitalization += capitalization;
  112. }
  113. if (totalCapitalization > max) // Сравнение капитализаций
  114. {
  115. max = totalCapitalization;
  116. bestSum = i;
  117. }
  118. Trace.WriteLine(i + "\nГодовой доход " + totalCapitalization);
  119. }
  120. Trace.Flush();
  121. bestTotalCapitalization = max;
  122. Debug.WriteLine("Подсчет суммы прошел успешно");
  123. return bestSum;
  124. }
  125. catch
  126. {
  127. Debug.WriteLine("Возникли проблемы с подсчетом");
  128. return 0;
  129. }
  130. }
  131. }
  132. }