Primzahl-Liste... funktioniert nicht richtig, keine Idee warum



  • Holla! Mein Programm funktioniert nicht wie gewünscht, ich finde aber eigentlich keinen Fehler. Zur Funktionsweise: eine Zahl zahl wird eingelesen, dann wird ein Array angelegt dass die Zahlen von 2 bis zahl repräsentatiert (nur repräsentatiert, nicht enthält). Dieses ist zuerst nur mit 0 gefüllt.

    Per Algorithmus vom "Sieb des Eratosthenes" werden dann Stück für Stück 0en ersetzt. Am Schluss werden alle Felderindices, die immer noch 0en enthalten, ausgegeben. Soweit zur Theorie.

    Hier der Code:

    int zahl = 0;
              printf("Geben Sie eine positive ganze Zahl ein:\n");
              scanf("%i", &zahl);
              int sieb[zahl-1];
    
              // Array wird mit 0 gefüllt
              for(int i = 0; i < zahl-1; i++)
              {
                  sieb[i] = 0;
              }
    
              // Per Eratosthenes-Algorithmus werden Vielfache von Primzahlen von 0 zu 999 geändert
              for(int m = 2; m <= zahl; m++)
              {
                  if(sieb[m-2] == 0)
                  {
                      for(int j = m*m; j <= zahl; j = j+m)
                      {
                          sieb[j-2] = 999;
                      }
                  }
              }
    
              // Ausgabe (aus den Indices werden dazu wieder die Zahlen, die sie repräsentatieren sollten)
              for(int k = 0; k < zahl-1; k++)
              {
                  if(sieb[k] == 0)
                  printf(k+2 + "\n");
              }
    
              return 333;
    

    333 wird zwar zurückgegeben, aber die Ausgabe an sich (also die Primzahl-Ausgabe in der letzten Schleife) klappt nicht. Ich hab keine Ahnung warum, bin den ganzen Vorgang mit Beispielzahlen durchgegangen und hab nichts gefunden, wo irgendwas schief geht...

    Für Hilfe danke im Voraus!



  • Lass den ganzen kack mit +2 und -1. Verschenke einfach die beiden ints sieb[0] und sieb[1]:

    #include <stdio.h>
    
    int main()
    {
    
        int zahl = 0;
        printf("Geben Sie eine positive ganze Zahl ein:\n");
        scanf("%i", &zahl);
        int sieb[zahl];
    
        // Array wird mit 0 gefüllt
        for(int i = 0; i < zahl; i++)
        {
            sieb[i] = 0;
        }
    
        // Per Eratosthenes-Algorithmus werden Vielfache von Primzahlen von 0 zu 999 geändert
        for(int m = 2; m < zahl; m++)
        {
            if(sieb[m] == 0)
            {
                for(int j = m*m; j < zahl; j = j+m)
                {
                    sieb[j] = 999;
                }
            }
        }
    
        // Ausgabe (aus den Indices werden dazu wieder die Zahlen, die sie repräsentatieren sollten)
        for(int k = 2; k < zahl; k++)
        {
            if(sieb[k] == 0)
                printf("%d\n",k);
        }
    
        return 333;
    }
    

    Programm wird einfacher und schneller davcon.

    Deine Fehjler war die Ausgabe, k+"\n" macht doch fürchterlichste Zeigerarithmetik auf dem Stringliteral!



  • Ah! Tatsache! Da war ich wohl zu lange in Java unterwegs...

    Danke!


Anmelden zum Antworten