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 einunsigned 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.
-
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 BitAlles 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.