繁体   English   中英

为什么我找到最大素数的程序永远不会写入控制台?

[英]Why does my program for finding the largest prime never writes to console?

我调试了我的代码,一切都很完美。 但是我的代码由于某种原因从未写入控制台。

这是我的代码:

  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();

问题:如何写入控制台?

什么?

它将完成,但它将永远持续,因为它必须做的所有迭代。

寻找计算是一项非常密集的计算,特别是以您的方式完成。

总结一下,它不会返回,因为你必须等待几分钟/小时/天/年? 要计算它。

您的算法太慢而无法在合理的时间内完成,因此您需要提出另一种方法。

首先,算法必须停止检查天真的定义(两个除数)。 如果你检查所有除数直到数字的平方根,并且没有找到任何除数,则该数字为素数。 其次,如果您正在寻找范围内的最大素数,请从该范围的顶部开始,向下,并在找到第一个素数时立即停止。 第三,没有必要尝试偶数。

实现这三个更改将使您的算法及时运行。

你的算法很差。 它必须进行大量的迭代。 正如其他人已经提到的那样,没有意义除以偶数,因此增加2,从3开始,你可以将迭代计数减少到给定数字的平方根。 我的也不完美,但它眨眼就结束了。 我们的想法是通过将给定数除以所有找到的除数来减少迭代次数。 请自担风险!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM