primzahl ermitteln



  • so moin erstmal,bin neu hier und hab auch schon direkt was auf dem herzen.

    info:
    das programm soll alle zahlen eines intervalls auf ihre teilbarkeit prüfen und so anzeigen wieviele primzahlen sich in dem intervall befinden.
    die äussere schleife beschreibt das intervall,die innere die zahlen,durch welche geteilt werden soll.
    eigentlich eine simple angelegenheit,doch ich bin unfähig wie es scheint.
    es startet nach dem compilieren,aber nach der eingabe der 2 zahlen tut sich nichts.

    danke schonmal für jeden tip!

    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;
    
    for (j=start;j==stop;j++)
        {
            for(i=2;i<j;i++)
            {
               if (j%i==0) primzahl=false;
    
               if (primzahl==false)
                    cout << "keine primzahl";
                else
                    cout << "primzahl";
            }
        }
    
        system("PAUSE");	
      return 0;
    }
    


  • Google mal nach dem "Sieb des Erastothenes"



  • Geht es dir um den Lerneffekt oder willst du einfach nur den Code dafür haben? Für den zweiten Fall kann ich dir meinen geben. Du musst mir nur Bescheid sagen.



  • Hi,

    zum Sieb:

    http://www.c-plusplus.net/forum/viewtopic.php?t=55960

    (ist zwar für VB, kannst du aber in C++ umsetzen.



  • 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



  • <EDIT> Falsches geschrieben</EDIT>



  • 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