Rumah >pembangunan bahagian belakang >C++ >Mengapa Program Mencari Nombor Perdana Saya Tidak Menghasilkan Sebarang Output, dan Bagaimana Saya Boleh Mengoptimumkannya?
Menyahpepijat Program Nombor Perdana dengan Julat Yang Besar
Seorang pengaturcara sedang menyelesaikan masalah program yang direka bentuk untuk mengenal pasti nombor perdana dalam julat pembolehubah yang besar dan panjang. Program ini berjalan tanpa ralat, tetapi tidak menghasilkan output. Inilah kod yang bermasalah:
<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>
Isu teras terletak pada logik gelung bersarang. Gelung luar bermula pada i = 0
, salah mengenal pasti 0 sebagai perdana. Tambahan pula, ketidakcekapan gelung dalam memperlahankan proses untuk julat besar dengan ketara. Ia menyemak kebolehbahagi sehingga i-1
, apabila ia hanya perlu menyemak sehingga punca kuasa dua i
.
Pendekatan yang lebih cekap menggunakan kaedah ayak pembahagian percubaan. Walaupun penyelesaian satu baris boleh dilakukan menggunakan LINQ, ia kurang boleh dibaca. Penyelesaian dioptimumkan yang lebih praktikal ditunjukkan di bawah:
<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>
Kod yang disemak ini menggunakan pendekatan berasaskan Sieve of Eratosthenes untuk prestasi yang lebih baik dengan julat yang lebih besar. Ia mengenal pasti dan mengeluarkan nombor perdana dengan betul dalam had yang ditentukan.
Atas ialah kandungan terperinci Mengapa Program Mencari Nombor Perdana Saya Tidak Menghasilkan Sebarang Output, dan Bagaimana Saya Boleh Mengoptimumkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!