Große Hexzahl als Dezimalzahl ausgeben.
-
Geh zeichenweise vor. Die Dezimaldarstellung brauchst du schließlich nur bei der Ausgabe. Es gibt keinen Grund das Zwischenergebnis in einem int zu speichern.
-
Kannst du das näher erläutern?
Wenn ich 462D5 3C9875C2 zeichenweise interpretiere,
dann fange ich beispielweise hier mit 4 an: 4 * 16^12
Dabei kann ich ja 16^12 bereits nicht mehr berechnen, da das schon größer als 32 Bit ist.
-
plexplask schrieb:
Dabei kann ich ja 16^12 bereits nicht mehr berechnen, da das schon größer als 32 Bit ist.
Ich habe gehört, jemand hat kürzlich eine Bibliothek geschrieben die mit großen Zahlen rechnen kann...
-
Ja natürlich, aber dann bin ich doch wieder beim Ausgangsproblem.
Meine BigInt Zahl sind in der Basis 2^32, wenn ich also 16^12 berechne, habe ich das Ergebnis wieder als BigInt Zahl, ich möchte aber am Ende eine Dezimale Zahl ausgeben.
-
plexplask schrieb:
Ja natürlich, aber dann bin ich doch wieder beim Ausgangsproblem.
Meine BigInt Zahl sind in der Basis 2^32, wenn ich also 16^12 berechne, habe ich das Ergebnis wieder als BigInt Zahl, ich möchte aber am Ende eine Dezimale Zahl ausgeben.Ich sehe da irgendwie dein Problem nicht. Jede einzelne Ziffer die du berechnen wirst wird naturgemäß zwischen 0 und 9 sein.
-
plexplask schrieb:
typedef unsigned int uint32;
typedef struct
{
uint32 n;
uint32 *words;
} BigInt;Frag mal nach, warum nicht
typedef struct { uint32 n; uint32 words[1]; } BigInt;
mit nur halb so vielen malloc()'s.
-
Wenn ich mich nicht irre, dann kann "uint32 words[1];" ja nur 2 32Bit Wörter enthalten, unsere Struktur soll aber dynamisch beliebig viele Wörter aufnehmen können.
-
Also langsam dämmert es mir, was du willst
Für sowas sollte es wohl Bibliotheken geben, http://gmplib.org/ fällt mir da spontan ein.
Ansonsten würde ich mal eine Multiplikation+Addition mit Strings implementieren, welche mit unbegrenzt langen Zahlen=Strings klarkommt, also z.B.char *addiere(const char *s1,const char *s2,char *erg) {}
sowie
char *mult(const char *f1,const char *f2,char *erg) {}
und damit dann über deine words laufen. Sollte wohl nicht zu aufwändig sein für Studenten, die haben eh zuviel Zeit
Hier mal ein Testfall für dich, welcher ein Einzeiler in der Programmiersprache meiner Wahl ist:
160 Bit:
hex: 'FFABCDEFFFABCDEFFFABCDEFFFABCDEFFFABCDEF'
dez: '1459624013674974718788098591257521174742471265775'
okt: '177653633677775274675777725715737776536336777752746757'
bin: '1111111110101011110011011110111111111111101010111100110111101111111111111010101111001101111011111111111110101011110011011110111111111111101010111100110111101111'Habe gerade im C++ Forum was gefunden: http://www.c-plusplus.net/forum/viewtopic-var-t-is-265048-and-start-is-20-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
scheint nicht viel C++ zu sein, es empfiehlt sich aber, bis zum Ende zu lesen.
-
plexplask schrieb:
Wenn ich mich nicht irre, dann kann "uint32 words[1];" ja nur 2 32Bit Wörter enthalten, unsere Struktur soll aber dynamisch beliebig viele Wörter aufnehmen können.
In das Array passt nur ein Wort. Macht aber nichts, wenn man dahinter genügend Platz freihält und über die Array-Grenzen hinausschreibt. Im Standard findet man sogar die Forderung, dass solche Konstruktionen keine Probleme mit der Ausrichtung machen dürfen.
Mach es lieber so, wenn deine Struktur nicht vorgeschrieben ist, wäre schlauer.
-
Wutz schrieb:
Ansonsten würde ich mal eine Multiplikation+Addition mit Strings implementieren
Mit Strings? Strings??