欠陥のある素数検出器のデバッグ
long 変数で定義された範囲内の素数を識別するように設計されたプログラムは、出力を生成できません。 コードの分析により、2 つの重大な欠陥が明らかになりました:
prime_num()
関数内の内部ループに欠陥のある条件 (i
) が含まれており、無限ループが発生します。if (i != j && i % j == 0)
は、追加の約数を含む数値を誤って素数として分類します。強化された素数検索アルゴリズム
より効率的な解決策は、「試行分割篩」方法を採用します。
<code class="language-csharp">Enumerable.Range(0, Math.Floor(2.52*Math.Sqrt(num)/Math.Log(num))).Aggregate( Enumerable.Range(2, num-1).ToList(), (result, index) => { var bp = result[index]; var sqr = bp * bp; result.RemoveAll(i => i >= sqr && i % bp == 0); return result; } );</code>
この改良されたアルゴリズムでは、近似を使用してテストされる主な候補の数を最小限に抑え、パフォーマンスが大幅に向上します。
以上が素数検出プログラムが失敗するのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。