100! Fakultät exakt berechnen
-
Uh man, nicht bös gemeint, aber dein Code ist grauslig :p
Ich finde du machst es dir etwas schwer. Vielleicht solltest du dir eine Klasse schreiben, die die großen Zahlen verwaltet, z.B. so
class BigNumber { public: BigNumber( unsigned int init ); void MultiplyWith( unsigned int num ); void Show(); private: // Die Variablen, die du dafür brauchst }; int main() { cout << "Dieses Programm berechnet die Fakultaet von n." << endl; cout << "Bitte geben Sie nun einen Wert fuer n ein." << endl; unsigned int zahl; cin >> zahl; BigNumber fac( 1 ); for ( unsigned int i=2; i<=zahl; i++ ) fac.MultiplyWith( i ); fac.Show(); }So hast du den ganzen Schrott nicht in der main-Funktion und kannst dich darauf konzentrieren, die MultiplyWith-Funktion zu implementieren. Musst dir halt vorher auf'm Papier überlegen, wie der Computer rechnen soll, dann kriegst du's sicherlich auch in Code-Form gegossen

-
Hey danke für die schnellen Antworten.
Ja sry ich weiss, dass mein Programm grad sehr gruslig aussieht. Bin leider noch blutiger Anfänger
Ich wollte auch meine Rechenschritte in eine Prozedur schreiben.
Nur das wollte ich eben erst machen, wenn das Programm läuft, dass für den Fall es ich die Prozedur(en) nicht hinbekommen wenigstens etwas abgeben kann.Ich werd mal versuchen mich mit deinem Code (Badestrand) auseinanderzustezen.
Steig da grad nicht so dahinter.Vielleicht seh ich den Wald vor lauter Bäumen nicht mehr.
Bin schon seit über 1 Monat an der Aufgabe und das war bissher das beste was ich hinbekommen habe.
-
Badestrand schrieb:
void MultiplyWith( unsigned int num );Bietet C++ nicht auch die Möglichkeit Operatoren wie bspw. * zu überladen, bzw. neu zu definieren? Wäre doch noch schöner!
-
ºgrimmsenº
schrieb:Badestrand schrieb:
void MultiplyWith( unsigned int num );Bietet C++ nicht auch die Möglichkeit Operatoren wie bspw. * zu überladen, bzw. neu zu definieren? Wäre doch noch schöner!
Ich dachte das wäre vielleicht ein bisschen viel für den Anfang
Aber sonst hast du natürlich vollkommen Recht!
-
man könnte auch einfach die GMP verwenden, die würd afaik inzwischen auch für C++ angeboten (wobei die Klassen glaub ich auch bloß Wrapper um die C Operationen sind)
-
Im produktiven Code wäre das eine Empfehlung, aber hier gilt:
sepH2807 schrieb:
Ich soll das mit Feldern und oder Strings lösen.
Also keine Bibliothek wie GMP, NTL ...Ansonsten solltest du das schriftliche Multiplizieren nachbauen (vergiss dabei Überträge nicht).
-
Hallo sepH2807,
Ich habe Deinen Code nicht gelesen, aber was erwartest Du denn als Ergebniss, wenn Du Feld[1] mit 3 multiplizierst. 3*0=0.
DJohn
-
DJohn@work schrieb:
Hallo sepH2807,
Ich habe Deinen Code nicht gelesen, aber was erwartest Du denn als Ergebniss, wenn Du Feld[1] mit 3 multiplizierst. 3*0=0.
DJohn
Ja genau. Somit sollte dann später in jedem Feld eine Zahl stehen.
für Fakultaet von 10! = 3628800
Also:
Feld[6] = 3
Feld[5] = 6
Feld[4] = 2
Feld[3] = 8
Feld[2] = 8
Feld[1] = 0
Feld[0] = 0Das setzt natürlich auch überträge auf das nächste Feld voraus.
-
Im Grunde brauchst du folgendes:
Ein dynamisches Array (zB std::map<int,Digit>) das die Digits beinhaltet und die erste Stelle der Zahl an Stelle 0 steht usw.
Dann den * Operator der ein Digit mit einem anderen multipliziert. Den Übertrag gibst du dann an die nächste Stelle mit dem + Operator weiter und gehst mit diesem + so lange durch das Array bis kein Übertrag mehr da ist.
Wenn du ohne temporäre Variablen arbeitest musst du folgendes beachten:
Bei * gehe von der höchsten Stelle bis 0 durch.
Bei + gehe von der aktuellen Stelle Richtung der höchsten.Ansonsten multiplizierst du den Übertrag immer gleich mit und ruinierst dir das Ergebnis.
-
sorry, das mit der GMP hatte ich übersehen (also, dass die nicht verwendet werden darf)