我有一个问题,我的程序执行,然后只是挂在某处执行。我基本上想知道是什么引起的。
for (long i = maxNumber; i > 2; i--)
{
IsPrime = true;
for (long g = 2; g < i; g++)
{
long temp = i % g;
if (temp == 0)
{
IsPrime = false;
break;
}
}
if (IsPrime == true)
{
largestPrimeFactor = i;
break;
}
}
最佳答案
如果我尝试正确,您的代码将尝试找到0到maxNumber之间的最大素数。用埃拉托舍内斯的筛子寻找0到maxNumber平方根之间的所有素数。然后,您可以从maxNumber迭代到0,得到一个由您刚刚找到的所有素数不可分割的数。
编辑:
试过这个
var sqrtMax = (int)Math.Sqrt(maxNumber);
var primeCandidates = Enumerable.Range(2, sqrtMax-1)
.ToDictionary(number => number, isComposite => false);
foreach (var number in primeCandidates.Keys.ToArray())
{
if (primeCandidates[number])
{
continue;
}
Parallel.ForEach(Enumerable.Range(2, sqrtMax / number - 1).Select(times => number * times),multiples=>
primeCandidates[multiples] = true);
}
var primeList = primeCandidates.Where(number => !number.Value).Select(pair=>pair.Key).ToArray();
var maxPrime = maxNumber;
while (primeList.AsParallel().Any(prime=> maxPrime%prime==0))
{
maxPrime--;
}
它在不到3秒的时间内找到maxPrime,maxNumber=600881475134(并行化是因为我认为需要很长时间)