primzahl ermitteln



  • ja so eine rosonanz hätte ich nicht erwartet, aber mir geht es tatsächlich um den lerneffekt,es ist sozusagen meine hausaufgabe.

    findet jemand einen fehler?



  • Maxi2 schrieb:

    Ich denke, dass die Zeile
    for(j = start; j == stop; j++)
    falsch ist, denn j wird nie gleich stop sein... es müsste heißen j <= stop

    stimmt, jetzt gibt er was aus, nur leider gibt er mir was falsches aus,denn wenn ich ihn den intervall von 4 bis 8 untersuchen lasse,gibt er 5 mal "keine primzahl" aus, wobei er,wenn ich mit einer primzahl beginne,er immerhin diese erkennt,aber die darauf folgenden immnoch unerkannt bleiben.

    merkwürdig



  • Keinen Fehler, sondern einen Verbesserungsvorschlag:

    2 ist die einzige gerade Primzahl. Also kannst du am Anfang einmal %2 rechnen und dann in deiner Schleife i immer um 2 erhöhen. Das spart ein wenig an Rechenzeit (obwohl man das heute nur bei großen Zahlenräumen merkt). Ich würde mir diese Vorgehensweise aber angewöhnen.



  • du setzt primzahl zwar auf false, aber nie wieder auf true



  • Desweiteren musst du afaik nur bis sqrt(stop) laufen.



  • Außerdem solltest du den Test, ob primzahl == false ist, erst machen NACHDEM die innere Schleife komplett durchlaufen ist, sonst gibt er einfach nur bei jedem Teiler aus ob die Zahl dadurch teilbar ist oder nicht.



  • Desweiteren musst du afaik nur bis sqrt(stop) laufen.

    hä?

    Außerdem solltest du den Test, ob primzahl == false ist, erst machen NACHDEM die innere Schleife komplett durchlaufen ist, sonst gibt er einfach nur bei jedem Teiler aus ob die Zahl dadurch teilbar ist oder nicht.

    hab ich,aber ändert nichts!

    ich habe das problem gefunden,weiss aber nicht wie ich es berichtigen soll:

    wenn die bool variable einmal auf false gesetzt ist(also er hat erkannt das zB 4 keine primzahl ist),dann lässt sich diese variable nicht mehr auf true setzen,da der rest nie null sein kann.
    weiss einer wie mans regeln kann.



  • ok habe den fehler gefunden,danke nochmal



  • wanderameise schrieb:

    Desweiteren musst du afaik nur bis sqrt(stop) laufen.

    hä?

    Er meint, dass du abbrechen kannst, wenn i größer ist als die Wurzel von j. Denn alle Zahlen über der Wurzel von j, die Teiler von j sind, hast du schon mit kleineren Zahlen abgedeckt.
    Beispiel: j=57
    Dann brauchst du nicht zu fragen, ob 57 durch 19 teilbar ist, weil es auch durch 3 teilbar ist, was du schon vorher testest.



  • Mit Optimierungen sieht das dann ungefähr so aus

    #include <iostream>
    
    using namespace std;
    
    int main() 
    { 
    
    int start,stop,j,i; 
    bool primzahl=true; 
    
    cout << "geben sie einen startwert ein" << endl; 
    cin >> start; 
    cout << "geben sie einen endwert ein" << endl; 
    cin >> stop; 
    
    if(start<=2) {
        cout << "2 ist eine Primzahl." << endl;
        start=3;
    }
    
    for (j=start+1-(start%2);j<=stop;j+=2) 
        { 
            primzahl=true;
            for(i=2;i*i<=j;i++) 
            { 
               if (j%i==0) {
                 primzahl=false;
                 break;
               }
            } 
    
            if(primzahl)
              cout << j << " ist eine Primzahl." << endl;
        } 
    
      system("PAUSE");     
      return 0; 
    }
    


  • Also ich hatte das selbe problem, ich geb dir mal meinen funktionierenden code, hoffe du kannst was damit anfangen... 😕

    Aber ich habe anstatt for-schleifen -> while schleifen benutzt.

    #include <stdio.h>
    #include <iostream.h>
    
    int main(int argc, char *argv[])
    {
      int EndZahl,a=1,b=2;
      cout<<"Gib die EndZahl ein: "<<endl;
      cin>>EndZahl;
    
      while(a!=EndZahl+1)
      {
        bool prim=true;
        b=2;
        while(b<a)
        {
          if(a%b==0)
          {
            prim=false;
            break;
          };
          ++b;
        };
        if(prim) cout<<a;
        ++a;
      };
      return 0;
    }
    

    Cu DFK 😉



  • Hi,

    der Code von DrZoidberg ist allerdings schneller, weil da nur jede 2.Zahl überprüft wird.
    @DrZoik: was bedeudet eigentlich エ ク ス ト リ ー ム プ ロ グ ラ ミ ン グ ?


Anmelden zum Antworten