Primzahl geht nur bis Zahl 32?
-
Hallo,
Ich habe folgendes Programm geschrieben:
#include <iostream> #include <cmath> using namespace std; bool is_prime(int x) { for (int i=2; i <= sqrt(x); ++i) { if (x % 1 == 0) return false; } return (x > 1); } int main() { int z; cout << "Bitte geben Sie eine ganze Zahl ein: " << endl; if (cin >> z) { if (is_prime(z)) { cout << "Die Zahl " << z << " ist eine Primzahl" << endl; } else { cout << "Die Zahl " << z << " ist keine Primzahl" << endl; } } system("PAUSE"); }(sry, die formatierungen gingen jetzt durch das kopieren kaputt.. mein dummer alter pc ^^)
Wenn ich die Zahl 31 eingebe, dann funktioniert noch alles prima. Aber ab 32 bekomme ich dann ein Minus-Ergebnis und ab der Zahl 34 (oder größer) nur immer das Ergebnis 0 (in Worten: Null).
Warum ist das denn so? Ich denke, dass hat etwas mit "int" zu tun, da "int" nur so und so viel speichern kann, richtig? Aber warum kommt dann auf einmal ein minus-ergebnis raus?
Und "int" kann doch eigentlich gar keine so großen Zahlen speichern - warum kommt nicht schon viel früher immer das Ergebnis 0 raus, sondern erst bei einer ganz großen zahl?
schonmal danke!
-
32 ist nicht wirklich groß...
for (int i=2; i <= sqrt(x); ++i) { if (x % 1 == 0) return false; } return (x > 1); }x%1 bringt nicht so viel oder? x%i wäre besser...
Evtl. solltest du auch noch testen ob das Einlesen geklappt hat (if (cin) ), sonst steht in z Mist drin...
-
oh, das ist mir jetzt aber peinlich. Ich habe den falschen Code reinkopiert. Aber hat auch etwas gutes, da ich jetzt den fehler mit %i weiß. Danke!
Hier der richtige Code:
#include <iostream> using namespace std; int main() { int z; int Result = 1; cout << "Bitte geben Sie eine ganze Zahl ein, die groesser als 0 ist: " << endl; cin >> z; if (z <= 0) { cout << "Fehler: Sie haben eine ungueltige Zahl eingegeben" << endl; system("PAUSE"); return 0; } if (z == 0) {Result = 0;} while( z != 0 ) { Result *= z; cout << z; if (z != 1) {cout << "*";} z--; } cout << endl << endl; cout << "Ergebnis: " << Result << endl; system("Pause"); return 0; }
-
//edit:
SO habs herausgefunden:Also bis 12 sind die Ergebnisse korrekt.
Ab 13 werden sie falsch.Bei 12! kriegt man 479001600 raus.
Das liegt auch noch im Darstellungsbereich.
Bei 13! sind wir schon bei 6 Milliarden....
Und Int(long) geht ja nur −2147483648 (−231) bis +2147483647 (231−1).
Selbst unsigned long int geht nur bis 4 milliarden.
Also überschreitet ab der Eingabe der Zahl 13 die Zahlenlänge des Ergebnisses die 32 Bitlänge der CPU.STimmt das so wie ich mir das denke?
-
wie oft passiert es eigentlich das das programm an diese stelle springen kann?
if (z == 0) {Result = 0;}
-
#include <iostream> using namespace std; int main() { int z; int Result = 1; cout << "Bitte geben Sie eine ganze Zahl ein, die groesser als 0 ist: "<< endl; cin >> z; if (z <= 0) { cout << "Fehler: Sie haben eine ungueltige Zahl eingegeben" << endl; system("PAUSE"); return 0; } if (z == 0) { Result = 0; } while( z != 0 ) { Result *= z; cout << z; if (z != 1) { cout << "*"; } z--; } cout << endl << endl; cout << "Ergebnis: " << Result << endl; system("Pause"); return 0; }
-
Also die while-Schleife könnte sollte vielleicht in den Else-Block der vorhergehenden If-Bedingung. Wenn z = 0 ist, dann passiert in der Schleife sowieso nicht mehr viel sinnvolles... (ist zwar schon durch die schleife abgefangen, aber dann ist der Code schneller zu entschlüsseln
)
-
unsigned long long sollte noch mehr Platz bieten aber bei Fakultäten reicht auch das schnell nicht mehr. Entweder entsprechende Bibliotheken benutzen, selbst was zusammenzimmern oder mit was anderem rechnen.
