Sieb des Eratosthenes Primzahlenberechnung mit array



  • Hallo

    wollte gerade beginnen aber bei der Schleife schreit der Compiler schon

    #include <iostream>
    using namespace std;
    
    int main(){
    
    int sieb[10000];
    int n;
    
    cout<<"Bitte Maximalwert < 10.000 ! eingeben fuer Berechnung der Primzahlen"<<endl;
    cout<<"mit Hilfe des Siebs des Eratosthenes"<<endl;
    cin>>n;
    
    for(int i=0,int j=2;i<10000 && j<=n;i++,j++){
            sieb[i]=j;
                            }
    
    }
    

    muss ich da zwei Schleifen daraus machen
    der Compiler schreibt:

    expected unqualified-id before "int"
    expected ,' or;' before "int"
    `j' undeclared (first use this function)

    danke für eure hilfe



  • Syntaktisch: Mehrfache Variablendeklaration geht im Schleifenkopf nicht, verlege eine Definition einfach davor.

    Und semantisch: Willst Du wirklich für jeden Schritt i und j gleichzeitig erhöhen?



  • Eisflamme schrieb:

    Syntaktisch: Mehrfache Variablendeklaration geht im Schleifenkopf nicht, verlege eine Definition einfach davor.

    ähm, ich würde einfach das 2te int weglassen. 😋


  • Mod

    Türlich geht das: for (int i=0, j=2; i<10000 && j<=n;i++,j++)

    edit: Das macht das Programm natürlich auch nicht richtiger, es compiliert bloß.



  • Eisflamme schrieb:

    Syntaktisch: Mehrfache Variablendeklaration geht im Schleifenkopf nicht, verlege eine Definition einfach davor.

    Und semantisch: Willst Du wirklich für jeden Schritt i und j gleichzeitig erhöhen?

    das i zählt von 0<10000 um das array zu füllen

    und das j zählt von 2 bis n Maximalwert

    so fülle ich doch das array für alle Werte von 2 !te Primzahl bis n Maximale Eingabe
    kannst mir bitte sagen was du an der Semantik falsches siehst



  • Gugelmoser schrieb:

    Eisflamme schrieb:

    Syntaktisch: Mehrfache Variablendeklaration geht im Schleifenkopf nicht, verlege eine Definition einfach davor.

    ähm, ich würde einfach das 2te int weglassen. 😋

    danke sehr



  • SeppJ schrieb:

    Türlich geht das: for (int i=0, j=2; i<10000 && j<=n;i++,j++)

    edit: Das macht das Programm natürlich auch nicht richtiger, es compiliert bloß.

    ist noch nicht das programm das berechnent welche zahlen primzahlen sind ist nur mal das einlesen der Werte für das array,
    muss mir erst überlegen wie ich das dann löse
    aber fürs erste danke
    das zweite int ist unlogisch jop

    wie bei variablen da schreibe ich auch int a,b,c;
    danke sehr



  • 🕶

    P.S.: Edit wegen Doppelpost.



  • Wie wäre es mit Folgendem?

    for(int i=0;i<10000 && i<=n-2;i++)
    { 
        sieb[i]=i+2; 
    }
    


  • Das zweite int? All die Jahre...



  • Endlosschleife

    #include <iostream>
    using namespace std;
    
    int main(){
    
    int sieb[10000];
    int n,w=0;
    
    cout<<"Bitte Maximalwert < 10.000 ! eingeben fuer Berechnung der Primzahlen"<<endl;
    cout<<"mit Hilfe des Siebs des Eratosthenes"<<endl;
    cin>>n;
    
    for(int i=0;i<10000 && i<=n-2;i++){
            sieb[i]=i+2;
                                      }
    
            for(int j=2;j<=n;j++){
                            if(sieb[j%2]==0){
                            sieb[j]=0;
                                            }
                            if(sieb[j%3]==0){
                            sieb[j]=0;
                                            }
                            if(sieb[j%5]==0){
                            sieb[j]=0;
                                            }
                            if(sieb[j%7]==0){
                            sieb[j]=0;
                                            }
            }                          
    
                            while(sieb[w]!=0)
                            cout<<sieb[w]<<" , ";                
    
    cin>>n;                                     
    }
    

  • Mod

    markuswenczel schrieb:

    Endlosschleife

    Und warum wundert dich das? Deine Variablen haben immer noch einbuchstabige Namen, sie werden immer noch alle am Funktionsanfang deklariert, deine Einrückung ist immer noch total unübersichtlich und ich wette du hast noch nicht einmal versucht, herauszubekommen wie man einen Debugger benutzt.



  • SeppJ schrieb:

    markuswenczel schrieb:

    Endlosschleife

    Und warum wundert dich das? Deine Variablen haben immer noch einbuchstabige Namen, sie werden immer noch alle am Funktionsanfang deklariert, deine Einrückung ist immer noch total unübersichtlich und ich wette du hast noch nicht einmal versucht, herauszubekommen wie man einen Debugger benutzt.

    Der trollt doch nur 🙄



  • SeppJ schrieb:

    markuswenczel schrieb:

    Endlosschleife

    Und warum wundert dich das? Deine Variablen haben immer noch einbuchstabige Namen, sie werden immer noch alle am Funktionsanfang deklariert, deine Einrückung ist immer noch total unübersichtlich und ich wette du hast noch nicht einmal versucht, herauszubekommen wie man einen Debugger benutzt.

    der debugger liefert keinen Fehler weil das Programm schrott ist, habe nur dampf abgelassen probiere ich jetzt mal mit bool das ganze
    ist wahrscheinlich einfacher

    An der Einrückung arbeite ich noch und die Variablennamen ja hast recht
    😉


  • Mod

    markuswenczel schrieb:

    der debugger liefert keinen Fehler

    Man muss nicht immer eine handfeste Fehlermeldung haben, wenn man einen Debugger benutzt. Ist dir eine Endlosschleife nicht Fehler genug? Unterbrich das Programm während der Endlosschleife und du findest deinen Fehler in wenigen Minuten.



  • SeppJ schrieb:

    markuswenczel schrieb:

    der debugger liefert keinen Fehler

    Man muss nicht immer eine handfeste Fehlermeldung haben, wenn man einen Debugger benutzt. Ist dir eine Endlosschleife nicht Fehler genug? Unterbrich das Programm während der Endlosschleife und du findest deinen Fehler in wenigen Minuten.

    den Fehler habe ich gefunden danke, aber mein Versuch scheitert leider kläglich

    Wie kann ich bei einem Index eines array den Wert auf 0 setzen
    ich dachte mit

    array[i]=0

    aber das funktioniert nicht
    Versuch:::

    #include <iostream> 
    using namespace std; 
    
    int main(){ 
    
    int sieb[10000]; 
    int n; 
    
    cout<<"Bitte Maximalwert < 10.000 ! eingeben fuer Berechnung der Primzahlen"<<endl; 
    cout<<"mit Hilfe des Siebs des Eratosthenes"<<endl; 
    cin>>n; 
    
    for(int i=0;i<10000 && i<=n-2;i++){ 
            sieb[i]=i+2; 
                                      } 
    
            for(int j=0;j<=n;j++){ 
                            if(sieb[j%2]==0){ 
                            sieb[j]=0; 
                                            } 
                            else if(sieb[j%3]==0){ 
                            sieb[j]=0; 
                                            } 
                            else if(sieb[j%5]==0){ 
                            sieb[j]=0; 
                                            } 
                            else if(sieb[j%7]==0){ 
                            sieb[j]=0; 
                                            } 
            }                           
                            for(int w=0;w<n;w++){            
                            if(sieb[w]!=0) 
                            cout<<sieb[w]<<" , ";                 
                                             }  
    
    cin>>n;                                     
    }
    


  • markuswenczel schrieb:

    for(int j=2;j<=n;j++){
            if(sieb[j%2]==0){
                sieb[j]=0;
            }
            if(sieb[j%3]==0){
                sieb[j]=0;
            }
            if(sieb[j%5]==0){
                sieb[j]=0;
            }
            if(sieb[j%7]==0){
                sieb[j]=0;
            }
        }
    

    @Markus - Du hast das mit dem Sieben nicht verstanden - schau noch mal beim alten Eratosthenes nach. In welcher Reihenfolge werden die Nicht-Primzahlen markiert?



  • Grob unterteilt kann man Primzahlen auf 2 verschiedene Arten berechnen,

    - Brute-Force (Moduloberechnung)
    - Algorithmen (Sieb des Eratosthenes z.B.)

    Eine Mischung beider Methoden empfiehlt sich eigentlich nur, wenn es am Ende darum geht, die Geschwindigkeit zu optimieren, mit der Primzahlen berechnet werden.

    Für den Anfang ist es wohl sinnvoller,zunächst mal nur eine der beiden Methoden umzusetzen.

    Zur Primzahlenberechnung gibt es hier im Forum auch schon einige Beiträge,
    einfach mal danach suchen.


Anmelden zum Antworten