Beliebig lange positive natürliche Zahlen
-
Hi!
Weis jemand wie man beliebig lange, positive und natürliche Zahlen in einer Variable speichern kann??? Sie müssen länger sein können als unsigned long! Gibt es da so eine Klasse wie string für Zeichen bloß für Zahlen? Man muss aber mit dieser Zahl dann auch rechnen können, also die vier Grundrechenarten sollten vorhanden sein!
thx
[ Dieser Beitrag wurde am 07.07.2002 um 16:39 Uhr von MagiC Creator editiert. ]
-
also ich glaube so etwas gibt es nicht... muss dich leider enttäuschen
poison215
-
Es gibt keinen vorgefertigten Datentyp in der C++ Standard Library dafür (glaube ich zumindest), aber mit dem sog. BCD (Binary coded digit)-Code kann man beliebig lange Zahlen ausdrücken und mit ihnen rechnen. Dabei wird jede Ziffer einer Zahl mit 4 Bit codiert...
0000 ist die Dezimalziffer 0,
0001 die Ziffer 1,
.
.
1001 die Ziffer 9
... halt eben das dezimale Äquivalent der Binärziffern.Diese 4 Bit-Kolonnen kannst Du dann in einem beliebig großen Feld speichern.
Da die Rechenregeln (für Grundrechenearten) für diesen Code nicht ganz trivial sind (nicht schwer, aber man muß einiges beachten), schlage ich mal vor, daß Du selbst mal im Internet ein wenig stöberst.
Vielleicht irre ich mich aber auch und es gibt bereits eine BCD-Code Klasse in der Standard Library.
-
kurtze frage um wieviel länger als ein unsigned long int ? und welches long hast du gemeint? ( _int32 oder _int64?) viele kompiler unterstützen bereits 64bit arythmetik. wenns länger sein muss. dann musst du dier selber was zusammenbauen. aus 2 _int64 kann man sicher recht einfach nen int128 zusammenbauen. einer fürs high _int64 und einer fürs low _int64.
gruss termite
-
Ich meine unsigned long int, mit dem rechne ich zur Zeit und bin noch weit unter dem gewünschten Ergebnis
. Aber das mit BCD werd ich mir mal anschauen, wenn ich es finde.
thx & cu
-
bei den Compilern die ich kenne, ist das long auch nicht größer als das int (32-Bit). Probier mal __int64 oder vielleicht long long. Das kann man dann natürlich auch wieder unsigned machen.
-
Danke, ich probier's sofort mal aus!
thx & cu
-
da gibts auch noch was das nennt sich 'Arbitrary Precision Mathematics' (APM). bis auf die division sind die grundrechen-algorithmen trivial. ich glaube es gibt auch c++ libs dafür.
-
hmm der BCD macht doch auch nix andres als ein handelsübliches char array... musst da dann halt zahlen reinschreiben... beispielsweise
char fuenfstellig[5];
fuenfstellig[0] = 1;
fuenfstellig[1] = 2;
fuenfstellig[2] = 3;
fuenfstellig[3] = 4;
fuenfstellig[4] = 5;ist exakt dasselbe wie BCD nur das du die zahlen nicht binär umrechnest.. wenn du dir da jetzt nen eigenen typen mit baust mit sovielen stellen wie du willst sollte alles gehen... prob ist halt nur das du jedesmal 246 mögliche stellen verschwendest und daher das rechnen wesentlich langsamer wird und die zahlen speicherplatzmässig wesentlich grösser werden.... ist bei BCD aber dasselbe in Grün
-
Schau dir mal diesen Text an, da gibt es auch ein Delphi Projekt zum Download
http://www.darmstadt.gmd.de/schulen/LICHTENBERGSCHULE/projekte/lkinfrr/gehrke/langzahl.htm
Ich erinnere mich düster, das wir im Grundstudium mal ne Übungsaufgabe für unendlich lange Zahlen hatten. Das lief im endeffekt darauf hinaus, eine Klasse zu erstellen, die Zahlen als Verkettete Listen von int speichert und die Rechenoperationen darauf zu implementieren.
Die Modulo Operation kannst du ja auch simpel als mehrfache Subtraktion implementieren.
hth