Heim >Backend-Entwicklung >C++ >Warum erzeugt mein Programm zur Primzahlensuche keine Ausgabe und wie kann ich diese optimieren?
Debuggen eines Primzahlprogramms mit großem Bereich
Ein Programmierer behebt Fehler in einem Programm, das darauf ausgelegt ist, Primzahlen innerhalb eines großen, langen Variablenbereichs zu identifizieren. Das Programm läuft fehlerfrei, erzeugt aber keine Ausgabe. Hier ist der problematische Code:
<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>
Das Kernproblem liegt in der Logik der verschachtelten Schleife. Die äußere Schleife beginnt bei i = 0
und identifiziert 0 fälschlicherweise als Primzahl. Darüber hinaus verlangsamt die Ineffizienz der inneren Schleife den Prozess bei großen Reichweiten erheblich. Es prüft die Teilbarkeit bis i-1
, wobei es nur bis zur Quadratwurzel von i
.
Ein effizienterer Ansatz nutzt die Probeteilungssiebmethode. Mit LINQ ist zwar eine einzeilige Lösung möglich, diese ist jedoch weniger lesbar. Eine praktischere optimierte Lösung wird unten gezeigt:
<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>
Dieser überarbeitete Code verwendet einen auf dem Sieb von Eratosthenes basierenden Ansatz für eine bessere Leistung bei größeren Reichweiten. Es identifiziert und gibt Primzahlen innerhalb der angegebenen Grenze korrekt aus.
Das obige ist der detaillierte Inhalt vonWarum erzeugt mein Programm zur Primzahlensuche keine Ausgabe und wie kann ich diese optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!