Почему моя программа поиска наибольшего простого числа никогда не пишет в консоль?

Я отладил свой код, и все работает отлично. Но мой код по какой-то причине никогда не пишет в консоль.

Вот мой код:

  long largest = 0;


        for (long i = 1; i < 600851475144; i++)
        {
            long check = 0;
            for (long j = 1; j < i + 1; j++)
            {

                if ((i%j) == 0)
                {
                    check++;
                }
            }
            if (check == 2)
            {
                largest = i;
            }
        }

        Console.WriteLine(largest);
        Console.ReadKey();

Вопрос: Как мне написать на консоль?

3 ответа

Решение

Ваш алгоритм слишком медленный, чтобы завершить его в разумные сроки, поэтому вам нужно придумать альтернативный подход.

Во-первых, алгоритм должен прекратить проверку наивного определения (два делителя). Если вы проверили все делители до квадратного корня из числа и не нашли ни одного, число будет простым. Во-вторых, если вы ищете самое большое простое число в диапазоне, начните с верхней части диапазона, спускайтесь и останавливайтесь, как только вы найдете первое простое число. В-третьих, нет смысла пробовать четные числа.

Внедрение этих трех изменений позволит вовремя запустить ваш алгоритм.

Ваш алгоритм плохой. Это должно сделать много итераций. Как уже упоминали другие, нет смысла делить на четные числа, увеличивая их на два, начиная с 3, вы можете уменьшить количество итераций до квадратного корня из заданного числа. мой не совершенен, но он заканчивается в мгновение ока. Идея состоит в том, чтобы уменьшить количество итераций путем деления заданного числа на все найденные делители. Попробуйте на свой страх и риск!

    long FindLargestPrimeDivisor(long number)
    {
        long largestPrimeDivisor = 1;
        while (true)
        {
            if (number % largestPrimeDivisor == 0)
            {
                number /= largestPrimeDivisor;
            }
            if (number < largestPrimeDivisor)
            {
                break;
            }
            largestPrimeDivisor++;
        }
        return largestPrimeDivisor;
    }

Какие?

Это закончится, но это будет длиться вечно из-за всех итераций, которые он должен сделать.

Расчет начального нахождения - это очень интенсивный расчет, особенно так, как вы это сделали.

Подводя итог, он не возвращается, потому что вы должны ждать минут / часов / дней / лет? Чтобы вычислить это.

Другие вопросы по тегам