Klasse für beliebig Grosse Zahlen
-
Hallo ich schreibe eine klasse für beliebig grosse Ganzzahlen.
Dazu werden die Zahlen als String über mittels eines Iterators in ein Char Vector eingelesen. Nun bin ich dabei Addition und Subtraktion zu implementieren.Jede Position im Vector entspricht einer Stelle (10er Basis). Daher habe ich den Char Vector gewählt. Nun tritt aber das Problem auf, dass mit dem im Char gespeicherten Wert für das Zeichen gerechnet wird, und nicht mit dem eigentlichen Zahlenwert. Wie funktioniert das genau, wie kann ich Zeichen ablegen im Char und wie Zahlen? Was muss ich beachten wenn ich den String Iterator dereferenziere un in den Char Vektor schreiben willl? -'0' (null abzählen)?
danke
-
So in etwa?:
class up_number { private: std::vector<char>value; public: up_number(const std::string& str) { std::string::const_iterator i(str.begin()),end(str.end()); for(;i!=end;++i) {//Zeichen voher prüfen wäre nicht schlecht... value.push_back((*i)-'0'); }; }; up_number(std::vector<char> i):values(i){}; const up_number& operator+(const up_number& rhs) { //das ist klar, oder? }; };
-
Ziemlich umständlich, wie du das machst. Versuchs doch mal mit vector<bool>.
-
mit bool? wie soll das gehen?
-
Warum rechnest du anstatt mit 10 nicht mit einer Basis, die auf deiner Maschine schnell ist?
Ich würde eventuell einen std::vector<unsigned int> nehmen und mit einer entsprechenden Basis rechnen (hier 4294967296).
-
mr.delete schrieb:
mit bool? wie soll das gehen?
binär?
-
eine binäre implementierung erhöht die komplexität der operationen aber stark.
speed ist unwesentlich
ich verstehe die variable vom typ Char einfach nicht, wann ich eine zahl und wann ein zeichen habe
-
Also vector<bool/char> ist ne ganz schlechte Idee dafür. Ich würde mit ganzen DWORDs arbeiten. Aber wieso das Rad neu erfinden? Es gibt doch schon etliche solcher Klassen. Zur Übung OK, aber wenn du die irgendwann mal ernsthaft einsetzen willst, dann hast du Zeit zuviel.
-
ich werde die nie im leben einsetzen die kriegt mein info assisten zur korrektur..
ist nur ne übung
-
Der Typ "char" beschreibt eine Speicherzelle mit der Groesse von mindestens 8 Bit.
Auf einem Computer gibt es nur Zahlen, so dass der 8 Bit-Wert den Wertebereich 2 hoch 8, also 0..255 (vorzeichenlos) oder -128..+127 (vorzeichenbehaftet) beinhaltet.
Schriftzeichen werden im Speicher abgebildet, in dem man von einer Zeichentabelle ausgeht, die den Zeichen eine Nummer zuordnet. 'A' z.B. ist Nr. 65 im ASCII-Zeichensatz, und daraus abgeleiteten Zeichensaetzen.
Schreibt man also,
char c = 'A';
Enthaelt 'c' danach in der Regel den Wert 65.
Ziffern liegen im ASCII-Zeichensatz von 48 .. 57. Um eine Ziffer in einen Zahlenwert umzuwandeln, muss man, wie Du schon gesagt hast, '0' (also 48) abziehen.
int ziffer = zeichen - '0';
Fuer die Implementierung der Berechnungen sollte man sich u.U. verschiedene Mikroprozessorarchitekturen o.Ae. zu Gemuete fuehren, um zu sehen, welche Loesungen es fuer die Addition/Subtraktion von Zahlen gibt.
Am einfachsten ist es wohl, bei der Addition zweier Zahlen, zunaechst beide vom Anfang her mit Null-Bytes aufzufuellen, so dass sie die gleiche Laenge haben. Dann vom Ende her die Bytes stueckweise summieren, den Uebertrag merken und jeweils auf die naechsten Bytes mitaufaddieren.
Uebrigens kann man statt einem char-Vektor auch gleich die String-Klasse nehmen, die kann auch nicht-druckbare Zeichen abspeichern (also irgendwelche Bytes). Zugriff und Speicherverbrauch duerften bei der String-Klasse auch besser sein.
Hoffe, das hilft.
-
Walli schrieb:
Also vector<bool/char> ist ne ganz schlechte Idee dafür. Ich würde mit ganzen DWORDs arbeiten. Aber wieso das Rad neu erfinden? Es gibt doch schon etliche solcher Klassen. Zur Übung OK, aber wenn du die irgendwann mal ernsthaft einsetzen willst, dann hast du Zeit zuviel.
Wieso DWORD? Ich würd am liebsten bits nehmen, vielleicht mit bitset. Weil ich bitset aber nicht so schön finde, nehm ich halt vector<bool>. Wenn man so kleine Einheiten nimmt, kann man alle Vielfachen von 8 (bool) als Bitzahl nehmen.
-
Michael E. schrieb:
Wenn man so kleine Einheiten nimmt, kann man alle Vielfachen von 8 (bool) als Bitzahl nehmen.
Und es ist scheißlangsam!
-
Hm, warum schaust Du Dir nicht mal libgmp an?
-
Walli schrieb:
Michael E. schrieb:
Wenn man so kleine Einheiten nimmt, kann man alle Vielfachen von 8 (bool) als Bitzahl nehmen.
Und es ist scheißlangsam!
Erklärung?
-
Wieso? Weil binäres herumverknüpfen viel langsamer ist, als wenn man den Prozessor diese Arbeit machen lässt.