如果我试了一遍,你的代码试图找到0和maxNumber之间的最大素数。使用Eratosthenes的筛子查找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(并行,是因为我认为这将花费很长的时间)
输入什么时候挂起?我没有看起来很难,但你确定它不仅仅是*花了很长时间*? O(N^2)对于足够大的N很长。 –
maxNumber的值是多少? –
Eratosthenes筛网:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes –