Überprüfen auf Primzahlen



  • #include <iostream>
    #include <iomanip>
    using namespace std;

    int main()
    {
    int zahl;
    cout << "Geben Sie eine Zahl ein: " ;
    cin >> zahl;

    for (int teiler=2; teiler < zahl; teiler++)
    {
    if (zahl % teiler ==0)
    {
    cout << "Die Zahl lässt sich durch " << teiler << " teilen und ist deshalb keine Primzahl" << endl;
    break;
    }

    if(teiler ==zahl-1)
    cout << "Die Zahl ist eine Primzahl= " << zahl;
    }
    }

    ich würde gerne noch das er mir alle teiler ausgibt wenn es keine Primzahl ist und nicht nur einen!!

    kann mir einer helfen?!
    danke im vor-raus

    grüße



  • Schau dir an, was break macht.



  • ja weiß ich schon, wie schreib ich das um das er mir das break erst macht wenn er alle teiler mir ausgegeben hat. ich komm da nicht weiter



  • DerAnfängerc++ schrieb:

    ja weiß ich schon, wie schreib ich das um das er mir das break erst macht wenn er alle teiler mir ausgegeben hat. ich komm da nicht weiter

    Lösche die Zeile mit dem ' break ' doch einfach und schaue, was dann passiert ...



  • dann gibt er mir zwar alle teiler aus aber auch die letzte if abfrage....
    hab schon versucht mit einer zweiten schleife aber klappt irgendwie nicht



  • Du musst dir halt merken, ob es einen Teiler gab. Mit einem Flag.

    int flag = 0;
    ...
    
      if (zahl % teiler ==0)
      { flag = 1;
      } 
    ...
    
    if (flag == 1) 
    {
      "Die Zahl ist (k)eine Primzahl!"
    }
    


  • DerAnfängerc++ schrieb:

    dann gibt er mir zwar alle teiler aus aber auch die letzte if abfrage....
    hab schon versucht mit einer zweiten schleife aber klappt irgendwie nicht

    gut erkannt, jetzt bist Du schon einen Schritt weiter.

    DirkB schrieb:

    Du musst dir halt merken, ob es einen Teiler gab. Mit einem Flag.

    Das wäre die Lösung, und dafür gibt es in C++ den Datentyp bool .

    #include <iostream>
    // #include <iomanip> // ist hier nicht notwendig
    using namespace std;
    
    int main()
    {
        int zahl;
        cout << "Geben Sie eine Zahl ein: " ;
        cin >> zahl;
    
        bool zahl_ist_prim = true; // wir nehmen an, dass die Zahl eine Primzahl ist, bis jetzt wurde ja noch kein Teiler gefunden
        for (int teiler=2; teiler < zahl; teiler++)
        {
            if (zahl % teiler ==0)
            {
                cout << "Die Zahl lässt sich durch " << teiler << " teilen und ist deshalb keine Primzahl" << endl;
                zahl_ist_prim = false; // es existier ein Teiler, also keine Primzahl
            }
        }
        if(zahl_ist_prim)
            cout << "Die Zahl ist eine Primzahl= " << zahl;
    }
    

    Gruß
    Werner



  • Super Danke an alle!!



  • gabs da nicht sowas, das man den teiler nicht bis zur zahl laufen lassen muss, sondern das auch die wurzel der zahl ausreicht?

    also for(teiler=2;teiler<sqrt(zahl);zahl++)?



  • ACnut schrieb:

    gabs da nicht sowas, das man den teiler nicht bis zur zahl laufen lassen muss, sondern das auch die wurzel der zahl ausreicht?

    also for(teiler=2;teiler<sqrt(zahl);zahl++)?

    Ja, man braucht auch nur alle ungerade Zahlen zu checken, nachdem man den Check durch 2 gemacht hat.
    Der TE will aber alle Teiler einer Zahl finden (Gut, da braucht man auch nur bis zur Wurzel* zu gehen und das Gegenstück zu berechnen).

    : Wobei man sqrt noch nicht einmal braucht. Die Bedingung teilerteiler <= zahl ist wesentlich effizienter.


  • Mod

    Die Bedingung teiler*teiler <= zahl ist wesentlich effizienter.

    Das stimmt für große Zahlen doch nicht. Eine Million Multiplikationen? (Bzw. Eine Million Shifts mit Inkrement, nach +2n+1)



  • Nathan schrieb:

    : Wobei man sqrt noch nicht einmal braucht. Die Bedingung teilerteiler <= zahl ist wesentlich effizienter.

    Wenn man bis N=100 geht vielleicht.


Anmelden zum Antworten