kostenloser Webspace werbefrei: lima-city


Mega-Zahlen verarbeiten

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    x*****k

    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 :cool:
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    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.
  4. Autor dieses Themas

    x*****k

    Dankeschön! Werde ich mal austesten!
  5. c*****s

    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;}
    }

  6. k***o

    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
  7. 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!
  8. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    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.
  9. c*****s

    thomasba schrieb:
    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.
    wer lesen kann, ist klar im Vorteil ;)

    "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)."
  10. projektverwaltung

    projektverwaltung hat kostenlosen Webspace.

    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.
  11. f*************e

    #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
  12. 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?
  13. f*************e

    Deshalb muss man das auch mit Strings lösen.
  14. computertechnikforum

    Kostenloser Webspace von computertechnikforum, auf Homepage erstellen warten

    computertechnikforum hat kostenlosen Webspace.

    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
  15. 400 stellen. lächerlich.

    es wurde eltzens die neuste größte primzahl gefunden. richtig gehört. 11millionen stellen.

    400 stellen. peanutz


    :blah::angel:
  16. 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?
  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!