Mega-Zahlen verarbeiten
lima-city → Forum → Programmiersprachen → C/C++ und D
auswerten
berechnen
bit
code
double
fertige klassen
glauben
http
machen
multi
programm
projekt
rechner
stellen
string
vergleich
vergleichen
zahl
ziemlich komische sachen
ziffer
-
Hallo Leute!
Ich will ein Programm schreiben (in C), welches 400-Stellige Zahlen vergleichen kann.
Ich muss also prüfen, welche die grösste ist.
also
if (zahl > bisheriges_maximum)
{
bisheriges_maximum = zahl;
}
Ich glaube nicht, dass das mit nem normalen Integer geht.
Gibt es dafür auch ne andere Lösung (nein kein BigInt und andere Zusatzbibliotheken).
mfg x-bLacK -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du kannst ja auch einfach jede Zahlenstelle von links nach rechts einzeln überprüfen...
1234
2345
=> 1 < 2 -> 2345 ist größer
1234
1345
=> 2 < 3 -> 1345 ist größer
Bei negativen Zahlen läufts genau anders herum. -
Dankeschön! Werde ich mal austesten!
-
noch ein kleiner Tipp:
Wahrscheinlich kannst/willst du die Zahlen im Binärsystem haben, d. h. eine Zahl ist ein Array aus Integern, wie z. B. unsigned int grosseZahl[50], du kannst dann die Vergleiche über den normalen Integer-Vergleich machen:
int i; short vergleich = 0; for(i=50; i>0; i--){ if(A[i] > B[i]){ vergleich = 1; break;} if(A[i] < B[i]){ vergleich = -1; break;} }
-
oder auch so:
int v = -1,w = 0; do { if (A[w] > B[w]) v = 1; w++; } while(A[w - 1] == B[w - 1] && w != n + 1); //n ist die Länge der Arrays return v;
Hoffe der Code funzt richtig!
Mfg
Beitrag geändert: 24.11.2008 14:44:48 von koslo -
Ich mache mal wieder Werbung für C++! ;) Also, mit C++ könntest du dir eine Klasse schreiben, die mit unendlich große Zahlen rechnen kann. Ihr kannst du dann auch den Vergleichsoperator == überladen, was dein eigentliches Problem ja war.
class BigInt { // ... friend bool operator==(BigInt& BI1, BigInt& BI2) { // ... } }; int main() { BigInt BI1("10000000"), BI2("100000000000000000"); if (BI1==BI2) // ... }
Ich glaube aus diesem Beispiel wird schnell klar, warum C++ einen klaren Vorteil bietet! -
Für sowas gibt es doch schon fertige Klassen, das Projekt ist von Gnu und nennt sich "GNU Multi-Precision Library", hier bekommst du mehr Infos:
http://en.wikipedia.org/wiki/GNU_Multi-Precision_Library
PS: Ich hab damit noch nicht gearbeitet, kann dir leider deswegen nicht mehr dazu sagen. -
thomasba schrieb:
wer lesen kann, ist klar im Vorteil ;)
Für sowas gibt es doch schon fertige Klassen, das Projekt ist von Gnu und nennt sich 'GNU Multi-Precision Library', hier bekommst du mehr Infos:
http://en.wikipedia.org/wiki/GNU_Multi-Precision_Library
PS: Ich hab damit noch nicht gearbeitet, kann dir leider deswegen nicht mehr dazu sagen.
"Ich glaube nicht, dass das mit nem normalen Integer geht.
Gibt es dafür auch ne andere Lösung (nein kein BigInt und andere Zusatzbibliotheken)."
-
Kannst du die Zahlen nicht als String speichern, dann einfach die Länge verlgeichen (also längere Zahl=größere zahl) und bei gleicher zeichenanzahl das erste zeichen der beiden strings vergleichen, falls das gleich ist das 2. vergleichen usw.
-
#include <stdio.h> #include <stdlib.h> int main(void) { /* Counter */ int i; /* Die Zahlen */ char Zahl1[] = "123346146461456456465466446467877877878787878787878787878"; char Zahl2[] = "222454545454545454545454545454545454545664645465456774973"; /* Kompletter Vergleich */ if(strcmp(Zahl1, Zahl2) == 0) { printf("[+] Zahlen sind identisch"); return 0; } /* Längenvergleich Start */ if (sizeof(Zahl1) > sizeof Zahl2) { printf("[+] Zahl 1 ist groeser"); return 0; } if (sizeof(Zahl1) < sizeof Zahl2) { printf("[+] Zahl 2 ist groeser"); return 0; } /* Längenvergleich Ende */ /* Länge ist identisch und Stellen sind Ungleich daher jede stelle Durchgehen bis eine Ungleicheit vorliegt */ i = 0; while(Zahl1[i] == Zahl2[i]) { i++; } /* Nun sind wir an der Stelle die Ungleich ist */ if (Zahl1[i] > Zahl2[i]) { printf("[+] Zahl 1 ist groeser"); } else { printf("[+] Zahl 2 ist groeser"); } return 0; }
So hätte ich das auf die schnelle Realisiert.
Wenn du es in eine Funktion packst müsste das schon hinhauen so.
Natürlich könntest du den ganzen oberen Teil weglassen und nur den Teil ab der While Schleife verwenden dann müsstest du halt noch Abfangen ob der String zuende ist und dann ausgeben lassen, dass die Zahlen gleich sind. Aber es ist halt während der Programmausführung effizienter Zuerst zu überprüfen ob sie denn Überhaupt gleich lang sind oder gar Identisch um zu vermeiden das er die Ganzen Stellen abklappert um dan zu merken es besteht kein Unterschied.
Beitrag geändert: 18.12.2008 14:52:42 von five-three-nine -
Ich glaube ein normaler 32-Bit Rechner kann nur Zahlen mit einer Größe von 2 hoch 32 berechnen(4.294.967.296). Mit Zahlen darüber macht der Rechner ziemlich komische Sachen. Also geht überhaupt ein Programm das 400-stellige Zahlen auswerten kann?
-
Deshalb muss man das auch mit Strings lösen.
-
Man könnte doch die Zahl in kleine "Happen" zerlegen oder?
Meinetwegen immer zehn Ziffern in einer Int?
und da dann zuerst die Ziffernanzahl vergleichen und dann Schrittweise die Happen
Edit:
Hab grade mifas Beitrag gelesen: dann 9 Ziffern
Beitrag geändert: 18.12.2008 15:30:54 von computertechnikforum -
400 stellen. lächerlich.
es wurde eltzens die neuste größte primzahl gefunden. richtig gehört. 11millionen stellen.
400 stellen. peanutz
-
mifa schrieb:
Ich glaube ein normaler 32-Bit Rechner kann nur Zahlen mit einer Größe von 2 hoch 32 berechnen(4.294.967.296). Mit Zahlen darüber macht der Rechner ziemlich komische Sachen. Also geht überhaupt ein Programm das 400-stellige Zahlen auswerten kann?
Joa, so oder so ähnlich haben wir es auch gelernt. Deswegen würde es mich auch interessieren ob überhaupt sowas geht.
Es gibt ja auch noch den Typ "double double", lässt sich damit was machen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage