Frage zu Primzahl-Generator



  • Hallo, ich versuche gerade, einen Primzahl-generator zu erstellen, der alle Primzahlen von 2 bis i ausgibt. ABer irgendwie verstehe ich gerade nicht wirklich, warum es bei mir nicht funktioniert.

    Hier der Code:

    #include <iostream>
    #include <cmath>
    #include <conio.h>
    
    using namespace std;
    
    bool primzahl(int n) {  
         int obergrenze=(int)pow(n, 0.5);
         bool akt_true(true), this_true;
    
         if(n==1) { return false; }                        //n=3
         if(n==2) { return true; }
         if(n%2==0) { return false; }
    
            for(int i=3; i<=obergrenze; i=i+2) {
               if(this_true==false) { break; }
               if(n%i==0) { this_true = false; } else { this_true=true; }     
               akt_true = this_true && akt_true;
            }
          return akt_true;
         }      
    
    int main(void) {
        cout << primzahl(53) << endl;
    
        for(int i=1; i<=50; i++) {
                if(primzahl(i)==true) {
                  cout << i << endl;                
                }
        }
    
        getch();
        return 0;
        }
    

    momentan sollen alle Primzahlen von 2 bis 50 ausgegeben werden, aber es werden komischerweise alle ungeraden Zahlen von 1 bis 49 ausgegeben. Weiterhin wird auch noch die zahl 2 ausgegeben. Sieht jemend von euch, wo ich den fehler habe?

    Vielen Dank im Voraus

    MfG reichs



  • Bin jetzt nicht der grosse c++ checker, aber initialisierst du this_true ueberhaupt?
    Wenn nicht bricht deine schleife immer sofort ab (falls bei C++ eine bool variable standartmaessig auf false oder einen Wert der als false interpretiert wird gesetzt wird) und du gibst akt_true zurueck was mit true initialisiert wurde (falls dieses akt_true(true) eine initialisierung darstellt).

    Davon abgesehen, wieso schreibst du nicht

    ...

    for ...
    {
    if (n % i == 0) return false
    }

    return true

    PS: der code ist ja mal echt eklig zu lesen...



  • asmodis schrieb:

    PS: der code ist ja mal echt eklig zu lesen...

    Dem kann ich nur zustimmen. Die Einrückung und Formatierung ist jenseits von Gut und Böse. Setzen 6. 😉

    Die Lösung hat asmodis bereits gepostet.

    Ich vermute, Du wirst Deine Gründe haben, nicht das Sieb des Eratosthenes zu verwenden, das wäre die effizienteste Lösung.
    Um die Laufzeit zu reduzieren könntest Du die bisher ermittelten Primzahlen in einen vector schreiben und statt alle ungeraden Zahlen, in der Schleife, zu testen, nur die bisher gefundenen Primzahlen testen. Sollte noch mal eine ganze Ecke schneller gehen. Insbesondere, wenn Du in größere Zahlenbereiche gehst.



  • Ich tippe einfach mal auf einen Perl-Hintergrund. Ich hatte auch mal so einen informatiklehrer, der gemeint hat, dass die {}-Klammern immer am anfang und ans ende der zeile gehören.


Anmelden zum Antworten