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 の間の最大の素数を見つけようとしています。エラトステネスの篩を使用して、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 の maxPrime を 3 秒以内で見つけます (並列化は時間がかかると思ったためです)

于 2012-06-11T09:59:57.020 に答える
0

投稿したループでスレッドが使用されているため、プログラムは「ハング」します。これは、ループが終了するまで他のコマンドを実行できないことを意味します。
この動作を防ぎたい場合は、代わりに別のスレッドを使用してコードを実行してください。

別のアルゴリズムを使用するとパフォーマンスが向上する場合がありますが、実行にかかる時間によっては、最終的には「ハング」が発生します。

于 2012-06-11T10:34:13.710 に答える