範囲の広い素数プログラムのデバッグ
プログラマーは、大きく長い変数範囲内の素数を識別するように設計されたプログラムのトラブルシューティングを行っています。プログラムはエラーなしで実行されますが、出力は生成されません。 問題のあるコードは次のとおりです:
<code class="language-csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication16 { class Program { void prime_num(long num) { bool isPrime = true; for (int i = 0; i < num; i++) // Outer loop starts at 0! { isPrime = true; for (int j = 2; j < i; j++) // Inefficient inner loop { if (i % j == 0) { isPrime = false; break; } } if (isPrime) { Console.WriteLine(i); } } } static void Main(string[] args) { Program p = new Program(); p.prime_num(100); // Example range } } }</code>
核心的な問題は、入れ子になったループのロジックにあります。外側のループは i = 0
で始まり、0 を素数として誤って識別します。 さらに、内側のループの非効率性により、広い範囲のプロセスが大幅に遅くなります。 i-1
の平方根までチェックする必要がある場合に、i
までの割り算をチェックします。
より効率的なアプローチは、試行分割篩法を利用することです。 LINQ を使用すると単一行のソリューションが可能ですが、可読性が低くなります。より実用的な最適化されたソリューションを以下に示します。
<code class="language-csharp">using System; using System.Collections.Generic; public class PrimeFinder { public static List<long> FindPrimes(long limit) { List<long> primes = new List<long>(); bool[] isPrime = new bool[limit + 1]; for (long i = 2; i <= limit; i++) { isPrime[i] = true; } for (long p = 2; p * p <= limit; p++) { if (isPrime[p]) { for (long i = p * p; i <= limit; i += p) isPrime[i] = false; } } for (long i = 2; i <= limit; i++) { if (isPrime[i]) { primes.Add(i); } } return primes; } public static void Main(string[] args) { List<long> primes = FindPrimes(100); // Example range foreach(long p in primes) { Console.WriteLine(p); } } }</code>
この改訂されたコードは、より広い範囲でのパフォーマンスを向上させるために、エラトステネスのふるいベースのアプローチを採用しています。 指定された制限内の素数を正確に識別して出力します。
以上が私の素数検索プログラムが何も出力を生成しないのはなぜですか?どうすれば最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。