为什么我的寻找最大质数的程序从不写入控制台?
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();
问题:如何写入控制台?
什么?
它会结束,但它会永远持续下去,因为它必须进行所有迭代。
素数计算是一个非常密集的计算,特别是在您完成它的方式中。
总结一下,不会return因为要等minutes/hours/days/years?计算那个。
您的算法太慢,无法在合理的时间内完成,因此您需要想出一个替代方法。
首先,算法必须停止检查朴素定义(两个除数)。如果您检查所有除数直到数字的平方根,但没有找到任何除数,则该数是质数。其次,如果您正在寻找范围内最大的素数,请从范围的顶部开始,向下寻找,并在找到第一个素数后立即停止。三、试偶数也没意义
实施这三个更改将使您的算法 运行 及时。
你的算法很差。它必须进行大量迭代。正如其他人已经提到的那样,除以偶数因此增加 2 是没有意义的,从 3 开始,您可以将迭代次数减少到给定数字的平方根。我的也不完美,但眨眼间就完成了。这个想法是通过将给定的数字除以所有找到的除数来减少迭代次数。
尝试风险自负!
long FindLargestPrimeDivisor(long number)
{
long largestPrimeDivisor = 1;
while (true)
{
if (number % largestPrimeDivisor == 0)
{
number /= largestPrimeDivisor;
}
if (number < largestPrimeDivisor)
{
break;
}
largestPrimeDivisor++;
}
return largestPrimeDivisor;
}
我调试了我的代码,一切正常。但出于某种原因,我的代码从不写入控制台。
这是我的代码:
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();
问题:如何写入控制台?
什么?
它会结束,但它会永远持续下去,因为它必须进行所有迭代。
素数计算是一个非常密集的计算,特别是在您完成它的方式中。
总结一下,不会return因为要等minutes/hours/days/years?计算那个。
您的算法太慢,无法在合理的时间内完成,因此您需要想出一个替代方法。
首先,算法必须停止检查朴素定义(两个除数)。如果您检查所有除数直到数字的平方根,但没有找到任何除数,则该数是质数。其次,如果您正在寻找范围内最大的素数,请从范围的顶部开始,向下寻找,并在找到第一个素数后立即停止。三、试偶数也没意义
实施这三个更改将使您的算法 运行 及时。
你的算法很差。它必须进行大量迭代。正如其他人已经提到的那样,除以偶数因此增加 2 是没有意义的,从 3 开始,您可以将迭代次数减少到给定数字的平方根。我的也不完美,但眨眼间就完成了。这个想法是通过将给定的数字除以所有找到的除数来减少迭代次数。 尝试风险自负!
long FindLargestPrimeDivisor(long number)
{
long largestPrimeDivisor = 1;
while (true)
{
if (number % largestPrimeDivisor == 0)
{
number /= largestPrimeDivisor;
}
if (number < largestPrimeDivisor)
{
break;
}
largestPrimeDivisor++;
}
return largestPrimeDivisor;
}