Sieb des Eratosthenes Primzahlenberechnung mit array



  • 🕶

    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