2012-06-11 3 views
0

У меня возникла проблема, когда моя программа выполняется, а затем просто зависает где-то во время выполнения. Я в основном хочу знать, что вызывает это.Программа Hangs во время выполнения

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

Сито Эратосфена: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes –

ответ

2

Если я испробовал это правильно, ваш код пытается найти наибольшее число между 0 и maxNumber. Используйте Сито Эратосфена для нахождения всех простых чисел между 0 и квадратным корнем из maxNumber. Затем вы можете перебирать от maxNumber до 0 для числа, неделимого всеми простыми числами, которые вы только что нашли.

EDIT: Пробовал эту

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

и найти maxPrime менее чем за 3 секунды для MAXNUMBER = 600881475134 (распараллеливание, потому что я думал, что это займет много времени)

+0

Спасибо за помощь. Это работает для меня :) – SpaceApple

3

Этот альгортм, вероятно, не висит. В зависимости от значения maxnumber может пройти долгое время, чтобы пройти через петли.

+0

Значение max number равно 600881475134. Но я выводим Console.WriteLine ("==="); чтобы увидеть, все ли это цикл. Дело в том, что он будет печатать выходные данные несколько раз, а затем останавливаться. Это заставляет меня думать, что он висит. – SpaceApple

0

Ваша программа'hangs ', Потому что его поток используется циклом, который вы опубликовали. Это означает, что вы не можете принимать какие-либо другие команды, пока цикл не будет завершен.
Если вы хотите предотвратить это поведение, вместо этого используйте разные потоки для выполнения кода.

Другой алгоритм может повысить производительность, но в итоге вы все равно будете испытывать «зависание» в зависимости от времени, которое требуется выполнить.

Смежные вопросы