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

3 回答 3

3

该算法可能不会挂起。根据它的值,maxnumber它可能需要长时间才能通过循环。

于 2012-06-11T09:51:22.050 回答
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--;
            }

对于 maxNumber = 600881475134,它在不到 3 秒的时间内找到 maxPrime(并行化是因为我认为这需要很长时间)

于 2012-06-11T09:59:57.020 回答
0

您的程序“挂起”,因为您发布的循环正在使用它的线程。这意味着在循环完成之前您不能执行任何其他命令。
如果您想防止这种行为,请改用不同的线程来执行您的代码。

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

于 2012-06-11T10:34:13.710 回答