Was ist der einfachste Weg, bigint in C zu implementieren?
Lesezeit: 5 Minuten
AlexBrand
Ich versuche, 100 zu berechnen! (d. h. die Fakultät von 100).
Ich suche nach dem einfachsten Weg, dies mit C zu erreichen. Ich habe herumgelesen, aber keine konkrete Antwort gefunden.
Falls Sie es wissen müssen, ich programmiere in Xcode unter Mac OS X.
Los geht’s: 933[100 digits removed]00000 🙂
– AndersK
27. Juli 2010 um 3:24 Uhr
@Anders: Diese Website ist Stapel Überlauf, nicht Kommentar Überlauf! :-Ö
– James McNellis
27. Juli 2010 um 3:25 Uhr
lol, ich weiß, dass ich den Wert von Wolframalpha bekommen kann. Ich lerne jedoch C und wollte wissen, wie dies geschehen könnte.
– AlexBrand
27. Juli 2010 um 3:33 Uhr
Duplikat von “BigInt” in C?
– aussen
11. Juli 2011 um 5:32 Uhr
Wenn Sie nach einer einfachen Bibliothek suchen, ist libtommath (von libtomcrypt) wahrscheinlich das, was Sie wollen.
Wenn Sie selbst eine einfache Implementierung schreiben möchten (entweder als Lernübung oder weil Sie nur eine sehr begrenzte Teilmenge der Bigint-Funktionalität benötigen und nicht auf eine Abhängigkeit von einer großen Bibliothek, Namespace-Verschmutzung usw. , dann könnte ich für dein Problem folgendes vorschlagen:
Da können Sie die Größe des Ergebnisses basierend auf einschränken nweisen Sie einfach ein Array von vor uint32_t der erforderlichen Größe, um das Ergebnis zu halten. Ich vermute, du wirst es wollen drucken das Ergebnis, daher ist es sinnvoll, eine Basis zu verwenden, die eine Potenz von 10 ist (dh Basis 1000000000) und nicht eine Potenz von 2. Das heißt, jedes Element Ihres Arrays darf einen Wert zwischen 0 und 999999999 enthalten.
Um diese Zahl mit einer (normalen, nicht großen) ganzen Zahl zu multiplizieren nmach sowas wie:
Wenn Sie wissen n niemals größer als 100 (oder eine andere kleine Zahl) sein und vermeiden möchten, in den 64-Bit-Bereich zu gehen (oder wenn Sie auf einer 64-Bit-Plattform sind und verwenden möchten uint64_t für Ihr Bigint-Array), dann machen Sie die Basis zu einer kleineren Potenz von 10, damit das Multiplikationsergebnis immer in den Typ passt.
Jetzt ist das Drucken des Ergebnisses nur so etwas wie:
Das Ergebnis dezimal auszugeben wird jedoch nicht so angenehm sein… 🙂 Natürlich, wenn Sie das Ergebnis in hexadezimaler Form wollen, dann ist es einfach:
Hoffe das hilft! Ich überlasse die Implementierung anderer Dinge (wie Addition, Multiplikation von 2 Bigints usw.) als Übung für Sie. Denken Sie einfach daran zurück, wie Sie in der Grundschule Addition, Multiplikation, Division usw. zur Basis 10 gelernt haben, und bringen Sie dem Computer bei, wie das geht (aber stattdessen in Basis 10^9 oder Basis 2^32), und Sie sollten es tun habe kein Problem.
Ein Kommentar zu den 64-Bit-Typen auf 32-Bit-Zielen: Auf jeder vernünftigen Hardware erzeugt eine 32×32-Multiplikation von Natur aus ein 64-Bit-Ergebnis, sodass es nicht ineffizient ist, in einen Typ umzuwandeln, der größer als die Wortgröße des Systems ist. Der Compiler generiert die korrekte 32×32->64-Multiplikationsanweisung, falls vorhanden. Und zumindest auf i386 ist die 64/32->32-Division (wenn die oberen 32 Bit kleiner als der Divisor sind) ein inhärentes Merkmal der 32-Bit-Divisionsanweisung und erfordert keine Emulation in der Software durch den Compiler. Auf weniger intelligenten 32-Bit-Zielen möchten Sie jedoch möglicherweise 16-Bit-Einheiten verwenden.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
27. Juli 2010 um 7:17 Uhr
Wenn Sie einen Bibliotheksaufruf durchführen, anstatt die gesamte Operation auf jeder Instanz zu inlinen, was der Compiler meiner Erfahrung nach immer mit integrierten 64-Bit-Operationen auf einer 32-Bit-Plattform durchführt, kann die Codegröße aufgebläht werden. obwohl die Inline-Operation höchstwahrscheinlich schneller sein wird. Dies ist ein Problem, auf das ich oft auf 32-Bit-Embedded-ARM-Plattformen gestoßen bin.
– Morten Jensen
30. Juni 2015 um 18:39 Uhr
Wenn Sie bereit sind, eine Bibliotheksimplementierung zu verwenden, scheint die Standardimplementierung zu sein GMP
Los geht’s: 933[100 digits removed]00000 🙂
– AndersK
27. Juli 2010 um 3:24 Uhr
@Anders: Diese Website ist Stapel Überlauf, nicht Kommentar Überlauf! :-Ö
– James McNellis
27. Juli 2010 um 3:25 Uhr
lol, ich weiß, dass ich den Wert von Wolframalpha bekommen kann. Ich lerne jedoch C und wollte wissen, wie dies geschehen könnte.
– AlexBrand
27. Juli 2010 um 3:33 Uhr
Duplikat von “BigInt” in C?
– aussen
11. Juli 2011 um 5:32 Uhr