Wertebereich wie abfangen?
-
Ich weiß zwar nicht was nicht funktioniert aber ich tippe mal auf die Erkennung des Überlaufs.
Mir fällt auf das Du long int benutzt bei mir war das genau wie int eine 32 Bit Variable damit konnte es dann nicht funktioneieren.
Abhilfe war dann long long int oder vielleicht auch __int64 gibts bei mir im BCB.Wenn das auch nicht klappt kannst Du ja die rekursive Lösung von Camper testen, die gefällt mir bis jetzt am besten.
Gruß Alex
-
Im Moment habe ich das Programm so wie unten.
Wenn ich nun eine 23 eingabe geht das ganze in den Überlauf und es wird eine 0 ausgegeben obwohl eigentlich beide Variablen unterschiedlich sind. Normalerweise müsste er nun in die erste Bedingung springen oder?
void fKtFakultaet(int Zahl) { /* Diese Funktion gibt die Fakultat von "Zahl" in einer Message aus" */ /* Die Funktion muss folgendermaßen aufgerugen werden: fKtFakultaet(DeineZahl); */ /* Kontrolle ob eingegebene Zahl größer 0 ist */ if(Zahl > 0) { /* Deklaration der Variable */ unsigned long int rechZahl = 1; //Beginn bei 1 da sonst "0*1" unsigned int CheckVar; bool flag; /* Auswertung / Berechnung der Fakultät */ for(int i=1; i <= Zahl;i++) { rechZahl *= i; CheckVar = rechZahl; if(rechZahl != CheckVar) //if(rechZahl == 0) { flag = 0; //setze Flag (Fehler) break; //nachher entfernen } else { flag = 1; //setzt Flag (OK) } } if(flag == 1) { cout<<"Fakultaet: "<<rechZahl<<endl; } else { cout<<"Error: Ueberlauf des Datentyps 'unsigned int'! "<<endl; } } else //Fehlerausgabe { cout<<"Fehler: Eingabe darf nicht '0' oder 'negativ' sein!"<<endl; } }
-
Ist zwar OT aber dennoch nicht ganz unwichtig:
#include <iostream.h> using namespace std;
iostream**.h** ist veraltet. AFAIK gibt's in iostream.h auch gar kein std.
Besser:
#include <iostream> using std::cout; using std::endl;
-
Habs nun mal ausgeben lassen:
Eingabe der Zahl: 34
rechZahl: 1 - CheckVar: 1
rechZahl: 2 - CheckVar: 2
rechZahl: 6 - CheckVar: 6
rechZahl: 24 - CheckVar: 24
rechZahl: 120 - CheckVar: 120
rechZahl: 720 - CheckVar: 720
rechZahl: 5040 - CheckVar: 5040
rechZahl: 40320 - CheckVar: 40320
rechZahl: 362880 - CheckVar: 362880
rechZahl: 3628800 - CheckVar: 3628800
rechZahl: 39916800 - CheckVar: 39916800
rechZahl: 479001600 - CheckVar: 479001600
rechZahl: 1932053504 - CheckVar: 1932053504
rechZahl: 1278945280 - CheckVar: 1278945280
rechZahl: 2004310016 - CheckVar: 2004310016
rechZahl: 2004189184 - CheckVar: 2004189184
rechZahl: 4006445056 - CheckVar: 4006445056
rechZahl: 3396534272 - CheckVar: 3396534272
rechZahl: 109641728 - CheckVar: 109641728
rechZahl: 2192834560 - CheckVar: 2192834560
rechZahl: 3099852800 - CheckVar: 3099852800
rechZahl: 3772252160 - CheckVar: 3772252160
rechZahl: 862453760 - CheckVar: 862453760
rechZahl: 3519021056 - CheckVar: 3519021056
rechZahl: 2076180480 - CheckVar: 2076180480
rechZahl: 2441084928 - CheckVar: 2441084928
rechZahl: 1484783616 - CheckVar: 1484783616
rechZahl: 2919235584 - CheckVar: 2919235584
rechZahl: 3053453312 - CheckVar: 3053453312
rechZahl: 1409286144 - CheckVar: 1409286144
rechZahl: 738197504 - CheckVar: 738197504
rechZahl: 2147483648 - CheckVar: 2147483648
rechZahl: 2147483648 - CheckVar: 2147483648
rechZahl: 0 - CheckVar: 0
Fakultaet: 0
Drücken Sie eine beliebige Taste . . .Wirklich doof und solangsam versteh ichs nicht mehr
Die Long variable müsste doch mehr fassen als die normale unsigned int?
-
dE_MaStEr schrieb:
Die Long variable müsste doch mehr fassen als die normale unsigned int?
nope, nur mindestens genauso viel. nimm long long oder __int64 wenn du hast.
-
camper schrieb:
dE_MaStEr schrieb:
Die Long variable müsste doch mehr fassen als die normale unsigned int?
nope, nur mindestens genauso viel. nimm long long oder __int64 wenn du hast.
Danke nun sollte es gehn oder sieht noch jemand einen Fehler?
Wenn nicht sag ich Danke an alle!
Gruss Michael
void fKtFakultaet(int Zahl) { /* Diese Funktion gibt die Fakultat von "Zahl" in einer Message aus" */ /* Die Funktion muss folgendermaßen aufgerugen werden: fKtFakultaet(DeineZahl); */ /* Kontrolle ob eingegebene Zahl größer 0 ist */ if(Zahl > 0) { /* Deklaration der Variable */ unsigned long long int rechZahl = 1; //Beginn bei 1 da sonst "0*1" unsigned int CheckVar; bool flag; /* Auswertung / Berechnung der Fakultät */ for(int i=1; i <= Zahl;i++) { rechZahl *= i; CheckVar = rechZahl; cout<<"rechZahl: "<<rechZahl<<" - CheckVar: "<<CheckVar<<endl; if(rechZahl != CheckVar) //if(rechZahl == 0) { flag = 0; //setze Flag (Fehler) break; //nachher entfernen } else { flag = 1; //setzt Flag (OK) } } if(flag == 1) { cout<<"Fakultaet: "<<rechZahl<<endl; } else { cout<<"Error: Ueberlauf des Datentyps 'int'! "<<endl; } } else //Fehlerausgabe { cout<<"Fehler: Eingabe darf nicht '0' oder 'negativ' sein!"<<endl; } }
-
Jedoch warum braucht man eine "unsigned long long int"? Warum reicht ein "unsigned long int" nicht aus?
Ein "unsigned long int" ist doch größer als ein normaler "unsigned int" oder sehe ich das falsch?
Gruss Michael
-
Nein, siehe 2 Posts darueber (ob beide unsigned oder beide nicht unsigned kommt ja auf selbe). Auf 32 Bit Systemen haben sie die selbe Groesse, bin mir aber nicht sicher, ob das vom Standard vorgschrieben ist ^^
Gruss,
DeSoVoDaMu
-
Hallo @ all,
könnte mir jemand verraten wie der Wertebereich des Datentyps "unsigned long long int" ist?Habe dazu leider keine Infos gefunden.
Gruss Michael
-
dE_MaStEr schrieb:
Hallo @ all,
könnte mir jemand verraten wie der Wertebereich des Datentyps "unsigned long long int" ist?Habe dazu leider keine Infos gefunden.
Gruss Michael
AFAIK ist long long int im Speicherbereich äquivalent zu long long. Und long long benötigt 8 Byte Speicher, d.h. unsigned long long besitzt den Wertebereich 0 bis 2^8 Byte - 1 Bit == 0 bis 2^64-1 (Bit) == 0 bis 18446744073709551615.
Caipi
-
mein beitrag zur diskussion:
#include <climits> using namespace std; int maximales_fak_argument () { int x=INT_MAX,i=1; for(;;) if(x/=++i, x==0) return i-1; return 1; // nur, damit der compiler nicht meckert } int fak (int x) { int ergebnis=1; if(x>maximales_fak_argument()) return 0; while(x>1) ergebnis*=x--; return ergebnis; }