einfache Primzahlprüfung - komisches verhalten



  • Hallo,
    momentan bin ich dabei C zu lernen.
    Nun habe ich probiert ein kleines Programm zu schreiben, welches eine Eingabe daraufhin überprüft ob es eine Primzahl ist oder nicht.
    Im groben funktioniert das ganze auch. Aber bei einigen Zahlen verhält das Programm sich ziemlich komisch. Warum kann ich mit meinen bescheidenen Kentnissen leider noch nicht erkennen.

    /* 
     * File:   main.c
     * Author: Torben
     *
     * Created on 9. Oktober 2015, 16:56
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #define oe (unsigned char)148 // sonst kann kein ö dargestellt werden
    #define ss (unsigned char)225
    
    /*
     * 
     */
    int main(int argc, char** argv) {
        int zahl;
        while (1) {
            printf("geben sie eine zahl ein\n");
            scanf("\n%d", &zahl);
            for (int i = 2; i < zahl / 2; i = i + 1) {
                if (zahl % i == 0) {
                    printf("keine Primzahl\n", i);
                    break;
                } else {
                    printf("Primzahl\n\a");
                }
            }
        }
        return (EXIT_SUCCESS);
    }
    

    Was passiert?
    Bei Zahlen < 7 Kommt kein Ton, wenn es sich um eine Primzahl handelt.
    Gebe ich beispielsweise eine 88 ein, sagt das Programm mir normal, dass es sich um keine primzahl handelt.
    bei bspw. einer 69 sagt es erst primzahl, dann keine Primzahl.
    bei der 101 sagt es mir dann ganz oft Primzahl.
    Kann mir einer erklären wo mein Fehler liegt?
    Vielen Dank für eure Mühen schon einmal im Vorraus.

    Gruß
    eSmurf



  • Also ob was ne Nicht-Primzahl ist, kannste innerhalb der for-Schleife feststellen.
    Aber ob es ne Primzahl war, kannste erst wissen, wenn allte Teiler durchprobiert wurden.

    Du brauchst goto.

    /*
     *
     * File:   main.c
     * Author: Torben & Volkard
     *
     * Created on 9. Oktober 2015, 16:56
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #define oe (unsigned char)148 // sonst kann kein ö dargestellt werden
    #define ss (unsigned char)225
    
    /*
     *
     */
    int main(int argc, char** argv) {
        int zahl;
        while (1) {
            printf("geben sie eine zahl ein\n");
            scanf("\n%d", &zahl);
            for (int i = 2; i < zahl / 2; i = i + 1) {
                if (zahl % i == 0) {
    				printf("keine Primzahl\n");
    				goto keinePrimzahl;
                }
            }
            printf("Primzahl\n\a");
            continue;
            keinePrimzahl:;
        }
        return (EXIT_SUCCESS);
    }
    

    Nein, es geht noch viel viel viel besser.

    Bau mal ne Funktion, der Du eine Zahl n übergibst, und die 0 zurückgibt, wenn n keine Primzahl war und die 1 zurückgibt, wenn n doch eine Primzahl war.
    Damit wird's fantastisch übersichtlich und das goto kann auch wieder verschwinden. Manche Leute (und alle Chefs, alle!) mögen kein goto.



  • eSmurf schrieb:

    ...
    Was passiert?
    Bei Zahlen < 7 Kommt kein Ton, wenn es sich um eine Primzahl handelt...

    Da sollte allerdings erst ab Zahlen < 6 kein Ton kommen. Wenn du 6 eingibst, behandelt deine for-Schleife das ja schließlich so: i < 6 / 2 => sie beginnt also bei 2, da 6 / 2 = 3 und i < 3 = 2, woraus folgt, dass i % 2 zu "keine Primzahl" führt.

    Den Fall, dass jemand 2 eingibt musst du ja auch bedenken.



  • phf_ schrieb:

    eSmurf schrieb:

    ...
    Was passiert?
    Bei Zahlen < 7 Kommt kein Ton, wenn es sich um eine Primzahl handelt...

    Da sollte allerdings erst ab Zahlen < 6 kein Ton kommen. Wenn du 6 eingibst, behandelt deine for-Schleife das ja schließlich so: i < 6 / 2 => sie beginnt also bei 2, da 6 / 2 = 3 und i < 3 = 2, woraus folgt, dass i % 2 zu "keine Primzahl" führt.

    Den Fall, dass jemand 2 eingibt musst du ja auch bedenken.

    Erstmal irrelevant.
    Seltenfälle bitte vorher per Hand abfangen. if(i<10) switch(i)... oder sowas.

    Wenn er bloß die Suchschleife dahingehend anpaßt, daß die Seltenfälle auch alle passen, dann macht er damit die Suchschleife kapott. Das darf nicht passieren. Die Suchschleife muss einfach und performant sein. Und mann muss sie wie verrückt ändern können und anpassen und neue Mathe-Ideen einbauen können. (Später bei t*t<=n bleiben eh nur 2 Seltenfälle übrig, die 0 und die 1, und bei t+=2 kommt die 2 wieder dazu, dann sinds 3.)



  • volkard schrieb:

    Erstmal irrelevant.
    ...

    Aber halt auch Teil der Fragestellung. 😉


Log in to reply