Fehler im Algorithmus zur Aufsummierung aller Primzahlen unter 2 Millionen



  • Hey,
    bin grad bei Aufgabe 10 auf Project Euler und hab ein Programm er der Codein C geschrieben, dass es eigentlich lösen sollte. Die ist einfach auf Primzahl zu testen, und wenn dies zutrifft es auf sum aufzuaddieren, dabei hab ich die Primzahlen 2 und 3 schon zu sum initialisiert (also 5). Allerdings liefert das Programm einen viel zu geringen Wert und ich find den Fehler nicht. Hier der Code:

    #include <stdio.h>
    
    int main(void) {
    
        unsigned long test, sum=5;
        unsigned int i, prime;
    
        for(test=5;test<2000000;test+=2) {
            prime = 1;
            for(i=3;i<=test/2;i+=2) {
                if(test%i==0) {
                    prime = 0;
                    break;
                }
            }
            if(prime) {
                sum += test;
            }
        }
    
        printf("%ld", sum);
    
        return 0;
    }
    


  • 232 sind wohl nicht genug für sum.
    Mach doch ein unsigned long long



  • Ok, thx hat funktioniert, das heißt long ist gleich int? und erst long long ergibt 2 hoch 64? Blöder Fehler hat mich viel Zeit gekostet, danke nochmal.



  • Nirvana134 schrieb:

    Ok, thx hat funktioniert, das heißt long ist gleich int? D

    Nein!
    Das kann sein, muss aber nicht.

    Für den Wertebereich gilt short <= int <= long .

    Also int kann so groß sein wie short oder long. Das hängt vom System ab.

    Sei froh, dass es mitlerweile long long gibt. 😃


  • Mod

    Nirvana134 schrieb:

    Ok, thx hat funktioniert, das heißt long ist gleich int? und erst long long ergibt 2 hoch 64? Blöder Fehler hat mich viel Zeit gekostet, danke nochmal.

    Das ist nicht standardisiert. Es gilt
    char <= short <= int <= long <= long long
    und
    char >= 8 bit, short >= 16 Bit, int >= 16 Bit, long >= 32 Bit, long long >= 64 Bit

    Alles aus dem Kopf zitiert und hoffentlich richtig. Wie es bei deinem System speziell ist, steht in deiner limits.h



  • Alles klar, merk ich mir, vielen Dank.



  • Ich hab hier gerade den K&R 1. Auflage deutsch liegen.
    Da steht für die Honeywell 6000 ein char mit 9 Bit und ein short, int und long mit je 36 Bit drin.


Anmelden zum Antworten