/// <summary> /// Метод поиска решения задачи перебором. Используется для тестирования разрабатываемого метода. /// Да, тесты надо писать по-другому. /// </summary> /// <param name="usingDigits">Используемые цифры в системе счисления.</param> /// <param name="digitsCount">Количество цифр в проверяемых числах.</param> /// <param name="checkingRanks">Количество проверяемых 'разрядов' (цифр) слева и справа.</param> /// <param name="useLog">Использовать ли вывод в консоль для логов.</param> /// <returns>Результат решения задачи.</returns> private static BigInteger TestMultiThreadGetLuckyTicketsCount(IReadOnlyList <char> usingDigits, int digitsCount, byte checkingRanks, bool useLog) { if (useLog) { Console.WriteLine($"Тестируем многопоточным перебором с параметрами ({usingDigits.Count}, {digitsCount}, {checkingRanks})..."); } var minNumberIncl = 0L; var maxNumberNotIncl = new NumberX(new string(usingDigits[usingDigits.Count - 1], digitsCount), usingDigits).ToInteger() + 1; if (maxNumberNotIncl < 0) { throw new Exception(); } var luckyTicketCount = new BigInteger(0); var resultLocker = new object(); var task = Parallel.For(minNumberIncl, maxNumberNotIncl, base10Number => { var baseXNumber = new NumberX(base10Number, usingDigits); var delta = 0; for (var rank = 0; rank < checkingRanks; rank++) { delta += baseXNumber.ToInteger(rank) - baseXNumber.ToInteger(digitsCount - 1 - rank); } if (delta == 0) { lock (resultLocker) { luckyTicketCount++; } } }); if (useLog) { Console.WriteLine($"[Тестовый многопоточный перебор] Результат: {luckyTicketCount}"); } return(luckyTicketCount); }
/// <summary> /// Метод поиска решения задачи перебором. Используется для тестирования разрабатываемого метода. /// Да, тесты надо писать по-другому. /// </summary> /// <param name="usingDigits">Используемые цифры в системе счисления.</param> /// <param name="digitsCount">Количество цифр в проверяемых числах.</param> /// <param name="checkingRanks">Количество проверяемых 'разрядов' (цифр) слева и справа.</param> /// <param name="useLog">Использовать ли вывод в консоль для логов.</param> /// <returns>Результат решения задачи.</returns> private static BigInteger TestSingleThreadGetLuckyTicketsCount(IReadOnlyList <char> usingDigits, int digitsCount, byte checkingRanks, bool useLog) { if (useLog) { Console.WriteLine($"Тестируем однопоточным перебором с параметрами ({usingDigits.Count}, {digitsCount}, {checkingRanks})..."); } var luckyTicketCount = new BigInteger(0); var numberX = new NumberX(0, usingDigits); var maxNumberX = new NumberX(new string(usingDigits[usingDigits.Count - 1], digitsCount), usingDigits); maxNumberX.IncrementAbs(); while (numberX != maxNumberX) { var delta = 0; for (var rank = 0; rank < checkingRanks; rank++) { delta += numberX.ToInteger(rank) - numberX.ToInteger(digitsCount - 1 - rank); } if (delta == 0) { luckyTicketCount++; } numberX.IncrementAbs(); } if (useLog) { Console.WriteLine($"[Тестовый однопоточный перебор] Результат: {luckyTicketCount}"); } return(luckyTicketCount); }