調試大範圍素數程式
一名程式設計師正在對一個旨在識別大而長的變數範圍內的素數的程式進行故障排除。程式運行沒有錯誤,但不產生任何輸出。 這是有問題的程式碼:
<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中文網其他相關文章!