程序在执行时挂起

时间:2012-06-11 09:46:38

标签: c# algorithm console

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

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

3 个答案:

答案 0 :(得分:3)

此算法可能不会挂起。根据{{​​1}}的值,可能需要非常长时间来完成循环。

答案 1 :(得分:2)

如果我正确地尝试了,你的代码试图找到0和maxNumber之间的最大素数。使用Eratosthenes的Sieve查找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--;
            }

并且maxNumber = 600881475134在不到3秒的时间内发现maxPrime(并行化是因为我认为需要很长时间)

答案 2 :(得分:0)

你的程序'ons',因为你发布的循环正在使用它的线程。这意味着在循环结束之前你不能接受任何其他命令 如果要防止此行为,请改用不同的线程来执行代码。

不同的算法可能会提高性能,但最终您仍会遇到“行”,具体取决于执行所需的时间。