Heim >Backend-Entwicklung >C++ >Warum erzeugt mein Programm zur Primzahlensuche keine Ausgabe und wie kann ich diese optimieren?

Warum erzeugt mein Programm zur Primzahlensuche keine Ausgabe und wie kann ich diese optimieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-13 22:02:45868Durchsuche

Why Isn't My Prime Number Finding Program Producing Any Output, and How Can I Optimize It?

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.

prüfen muss

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn