Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }