2012-06-11 108 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 '因爲它的線程正在你發佈的循環中使用。這意味着在循環完成之前,您不能執行任何其他命令。
如果您想要防止此行爲,請使用不同的線程來執行您的代碼。

一個不同的算法可能會提高性能,但最終您仍然會經歷一個'航',具體取決於執行時間。