C: sehr große Zahlen einlesen

Dann könntest du z.B. eine Zeile aus der Datei einlesen und jede Ziffer einzeln interpretieren und entsprechend zu einem mit 0 initialisierten BigInt Variablen addieren.

PseudoCode:
Code:
BigInt b = 0;

while (d = readDigit(datei)) {
  b *= 10;
  b += d;
}
Gruß

Danke, gute Idee.
Das geht allerding für ein 10er System.
Ich muss die Zahl aus der Textdatei jedoch im Zahlensystem zur Basis 2^32 abspeichern.
Mir fällt da keine Idee ein, wie sieht es bei euch aus?
 
Danke, gute Idee.
Das geht allerding für ein 10er System.
Du willst ja auch Zahlen im Zehnersystem einlesen, insofern ist das schon ok so.

Ich muss die Zahl aus der Textdatei jedoch im Zahlensystem zur Basis 2^32 abspeichern.
Mir fällt da keine Idee ein, wie sieht es bei euch aus?
deepthroat hat dir doch schon eine Idee geliefert: implementiere erst mal Funktionen, die es erlauben, einen uint32 auf einen BigInt zu addieren bzw. zu multiplizieren. Bei der Umwandlung vom Zehnersystem in BigInt greifst du dann auf diese Funktionen zurück, in der Art wie deepthroat es erklärt hat.

Grüße,
Matthias
 
Danke nochmals,
hat soweit alles geklappt, ich kann nun aus einer beliebigen Dezimalzahl in einer Text-Datei,
eine BigInt-Zahl zur Basis 2^32 erstellen.
Ich kann auch 2 BigInt addieren.

Wenn ich nun eine BigInt-Zahl als Dezimalzahl darstellen will, gibt es da eine gute Möglichkeit?

Beispiel: ich lese aus einer Textdatei die
Dez-Zahl: 1234567891023298
(Binär: 0000 0000 0000 0100 0110 0010 1101 0101 0011 1100 1001 1000 0111 0101 1100 0010)
(Hex: 0x462D5 3C9875C2)
In meinem BigInt a, mit a.n=2, ist sie nun folgendermaßen im Little-Endian-Format abgespeichert:
a.words[0]=3C9875C2;
a.words[1]=462D5;
Im Prinzip ist die dezimaldarstellung ja: 0x462d5 * 2^32 + 0x3C9875C2
Gibt es da eine einfache Methode die mir nicht direkt einfällt?
Gruß,
eto
 
Also ich implementiere gerade das Einlesen von Dezimalzahlen. Das mache ich folgendermaßen (vll. nicht elegant, aber egal hauptsache das funktioniert irgendwie) ;) :

char[Anzahl Digits in der Datei] <- Da kommt eine Kopie der großen Zahl rein.
Lässt sich da problemlos ohne malloc reinspeichern.

Die Zahl wird dann einfach durch 2 geteilt (mit dem Schulalgorithmus). Fall die letzte Ziffer sich nicht gerade teilen lässt -> 1 schonmal ins BigInt (ansonsten halt 0) und dann pro Durchlauf shiften, bzw. in ein anderes Wort schreiben.

Folglicherweise würde ich umgekehrt die Binärdaten auch so wieder auslesen... denke ich. Mal sehen, ob das auch so klappt. =)


LG, D
 
Zuletzt bearbeitet:
Zurück