2012-06-11 67 views
0

我在执行程序时出现问题,然后在执行过程中挂起。我基本上想知道是什么原因造成的。程序在执行时挂起

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; 
    } 
} 
+16

输入什么时候挂起?我没有看起来很难,但你确定它不仅仅是*花了很长时间*? O(N^2)对于足够大的N很长。 –

+0

maxNumber的值是多少? –

+5

Eratosthenes筛网:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes –

回答

2

如果我试了一遍,你的代码试图找到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(并行,是因为我认为这将花费很长的时间)

+0

感谢您的帮助。这对我有用:) – SpaceApple

3

这个algorthm可能不会挂起。根据maxnumber的值,可能需要很长的时间才能通过循环。

+0

最大数值是600881475134.但是我输出一个Console.WriteLine(“===”);看看它是否还在循环。问题是它会打印输出几次然后停止。这让我觉得它挂了。 – SpaceApple

0

你的程序'hangs '因为它的线程正在你发布的循环中使用。这意味着在循环完成之前,您不能执行任何其他命令。
如果您想要防止此行为,请使用不同的线程来执行您的代码。

一个不同的算法可能会提高性能,但最终您仍然会经历一个'航',具体取决于执行时间。