Addition großer Zahlen?



  • HI erstmal. scheint ja ein gut besuchtes Forum hier zu sein. Hoffe ihr könnt mir weiterhelfen. Wir haben eine Aufgabe bekommen. Wir sollen große Zahlen addieren. Addition zweier Zaheln ist ja trivial. Nur habe ich Problem mit den Digits und den langen Zahlen. 😞
    Hier ist die Aufgabe:

    Addition Großer Zahlen
    Die Aufgabe ist es ein Programm zu schreiben, dass beliebig lange Zahlen einliest, addiert und das Ergebniss ausgibt.

    Spezifikation:
    Das Programm fragt wieviele Dezimalstellen die eingegebenen Zahlen maximal haben werden.
    - Das Programm fordert den Benutzer auf die erste Zahl über die Tastatur einzugeben und liest sie ein.
    - Das Programm fordert den Benutzer auf die zweite Zahl über die Tastatur einzugeben und liest sie ein.
    - Die zwei Zahlen werden vom Programm addiert.
    - Das Programm druckt das Ergebniss aus.

    Randbedingungen:
    - Die Zahlen koennen beliebig lang sein!
    - Die Zahlen sind ganz und >= 0.
    - Es braucht nicht auf Eingabefehler geteste zu werden.
    - Die Zahlen koennen unterschiedliche Länge haben.

    Hinweise
    Verwalten Sie die Zahlen intern als Array von Digits. Jedes Digit entspricht eine Dezimalstelle. Dies ist nicht sonderlich effizient, macht aber vieles einfacher.
    Beachten Sie, dass die erste Stelle der Eingabe die wichtigste ist. Dies ist auch bei der Ausagabe zu beachten.
    Das Einlesen geht bequem indem man zunaechst die ganze Eingabezeile in ein String (char*) einliest, und aus diesem String die einzelnen Characters herausliest. Es gibt auch andere Lösungen dieser Teilaufgabe.
    Bei der Addition muss man aufpassen mit dem Carry (Übertrag). Dies kann auch die führende Stell betreffen!

    Verstehe nicht wie ich das richtig umsetzen soll. Unser Prof. meinte es sein ganz einfach nur irgendwie kann ich ihm nicht zustimmen. 😞

    Ich hoffe ihr könnt mir helfen.

    Könnt ihr mir Bücher empfehlen zum leichten Einstieg in C???



  • Keiner wird dir fertigen Code liefern, obwohl es für die meisten hier kein Problem wäre. Wenn du uns aber zeigst, dass du selbst versuchst/versucht hast, das Problem zu lösen (z. B. indem du uns deine Gedankenansätze zeigst) und sagst, wo genau es nicht klappt, dann wird dir sicher jemand helfen.



  • Ich will dir einen Tipp geben: Nimm dir einen Stift, Papier und zwei beliebige Zahlen und addiere sie, wie du es in der Grundschule gelernt hast und entwickel daraus einen Algorithmus.

    Bspl:

    13
    +  8
      1   (3+8=1 und 1 im Sinn)
    ----
      21
    ====
    


  • sollen es denn beliebig viele zahlen sein, odda
    nur zwei, die addiert werden, also

    10
    + 10
    
    //oder
    
      293
    +  93
    +  36
    

    denn wenn du wirklich BELIEBIG viele zahlen (NICHT ZIFFERN)
    addieren willst, könnte das mit der 1 im sinn
    /theoretisch) problematisch werden



  • Warum das denn? Wenn ich 3 Zahlen addieren will, addier ich eben erst die ersten beiden Zahlen, und dann das Ergebnis mit der 3. Zahl. Dann hab ich immer nur 2 Zahlen addiert..



  • Eine MLU Informatik Hausaufgabe von Jopsi, aha:

    Beispiel:

    523,256 und 4652,895

    523+4652=5175

    1. Array: 256
    2. Array: 895
    3. Array: 151 --> Übertrag 1 --> 5175+1

    Ergebnis: 5176,151

    1. Ganzzahlteil vor dem Komma als long oder double einlesne und addieren
    2. Für 3 Arrays Speicher reservieren (malloc)
    3. Dezimalteil jeder Zahl in eine jeweiliges Array
    4. Schriftliches addieren der Dezimalstellen mit Hilfe der beiden Arrays
    5. Übertrag beachten
    6. Jeweilige Ergebnisse in 3. Array speichern
    7. Restübertrag auf Ganzzahlergebnis umlegen

    Umsetzung in C ist nicht schwer führt hier aber zu weit.

    Gruß



  • Danke erstmal!!!
    Ja ich studiere an der MLU Wirtschaftsmathematik. Leider brauch ich einen Info 1 Schein. Jedoch habe ich bisher nur in Turbo Pascal programmiert. Und das ist auch schon 2 Jahre her. Wir haben gleich nach der ersten Vorlesung Programmieraufgaben bekommen. Er ist Holländer und spricht mit leichtem Akzent. Er hat zwar auch ein Script doch das ist 260 Seiten lang und auf Englisch. Wirkt etwas demotivierend. 😞

    Aber wieder zur Aufgabe. Ich muss die Zahl also trennen. In vor und nach dem Komma. Das Problem ist jetzt das die Zahl unendlich lang sein soll. Muss ich das jetzt mit einer Schleifen machen, so daß er von Stelle zu Stelle geht und beide Zahlen addiert? (gegebenenfalls den Übertrag übernehmen)

    Danke auf jeden Fall für eure Hilfe.



  • 12polizei schrieb:

    Aber wieder zur Aufgabe. Ich muss die Zahl also trennen. In vor und nach dem Komma. Das Problem ist jetzt das die Zahl unendlich lang sein soll. Muss ich das jetzt mit einer Schleifen machen, so daß er von Stelle zu Stelle geht und beide Zahlen addiert? (gegebenenfalls den Übertrag übernehmen)

    Unendlich lang geht nicht. Sowas langes passt in deinen endlichen Rechner nicht rein. Beliebig lang klingt besser. Schleife, die Ziffernweise addiert und die
    Überträge mit nimmt klingt doch schon sehr fein. Musst nur aufpassen, dass du
    die richtigen Stellen addierst 🙂



  • Gibt es im Netz Tutorials zu C die man empfehlen kann? Bin nämlich noch ziemlicher anfänger. Befasse mich erst seit ca. zwei Wochen etwas mit C. Der Rest der Zeit geht für Algebra und Analysis drauf.



  • Scrol man n bissl die Seite rauf, rechts oben findest du den Link "Tuturials",
    gleich neben den "Büchern".

    http://www.c-plusplus.net/tutorials.htm



  • Er hat zwar auch ein Script doch das ist 260 Seiten lang und auf Englisch. Wirkt
    etwas demotivierend. 😞

    Du wirst dich noch wundern wenn du Info 2 bei Prof. Dr. Zimmermann hast. DAS Skript ist demotivierend ;).

    bye

    tt



  • Hallo,

    sitze an der gleichen Aufgabe. Die Erklärung klingt ja ganz logisch. Mir war aber nie klar welche Art von Zahlen gemeint sind. In der Spezifikation steht was von Dezimalstellen und unter Randbedingungen steht das die Zahlen ganz und >= 0 sind ???

    AUsgehend von einer Dezimalzahl mit Komma fangen die Probleme schon an. Wie ich das Komma finde krieg ich noch hin. Aber wie sage ich ihm das er die Zahlen vor dem Komma nach dort und die Zahlen danach nach hier speichern soll?

    Vielleicht gibts ja ein paar Ideen. Ist immer schwer für Neulinge die Funktionsweise eines Programms vorzustellen.

    Viele Grüße



  • TheTester schrieb:

    Er hat zwar auch ein Script doch das ist 260 Seiten lang und auf Englisch. Wirkt
    etwas demotivierend. 😞

    Du wirst dich noch wundern wenn du Info 2 bei Prof. Dr. Zimmermann hast. DAS Skript ist demotivierend ;).

    bye

    tt

    Zum Glück brauche ich nur Info 1. :p



  • Hab das Programm gerade von einem Bekannten bekommen. Versuche es gerade nachzuvollziehen.

    Jeder Anfang ist schwer.



  • HI, hab den Quelltext.
    Der Kompiler streikt aber bei einer bestimmten stelle.
    Kann mir aber nicht erklären warun er gerade dort streikt.
    [code]
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    int zero(char *string,const int len)
    {
    int stellen = (int)strlen(string);
    if (len-stellen ==0) return 0;
    memmove (&string[len-stellen], string, stellen+1);
    memset(string, '0', len-stellen);
    };

    int main()
    {
    char *string1, *string2, *temp;
    int len, i, carry, zahl1, zahl2;

    //Eingabe
    printf("\nlen: "); scanf("%d" , &len);
    string1 = malloc(len +2);
    string2 = malloc(len +2);
    printf("\nerste Zahl: "); scanf("%s", string1);
    printf("\nzweite Zahl: "); scanf("%s", string2);

    //anführende Nullen "setzen"
    zero(string1, len+1);
    zero(string2, len+1);

    //--------Addition-------
    carry=0;
    for (i=len; i>=0, i--); <--(HIER ZEIGT ER EINEN FEHLER AN)
    {
    zahl1 = string1[i]-`0`;
    zahl2 = string2[i]-'0';

    if (zahl1 +zahl2 + carry > 9)
    {string[i] = zahl1+zahl2+carry-10+'0'; carry=1;}
    else
    {string1[i] = zahl1+zahl2+carry+'0'; carry=0}
    };
    //anführende Nullen "löschen"

    temp = string1;
    while (*temp == '0') temp++;
    //Ausgabe
    printf("\nDas Ergebnis ist %s\n",temp);
    //Freigabe
    free(string1);
    free(string2);
    };

    Aber aus dem was ich jetzt schon mitbekommen habe müsste das doch stimmen.



  • Hab den Fehler schon gefunden. Hab statt einem Semikolon ein Komma gesetzt. Irgendwie sucht man nach größeren Fehlern. Aber jetzt bleibe ich bei nächsten Punkt hängen.
    zahl1 = string1[i]-'0'; <-----------------
    zahl2 = string2[i]-'0';

    if (zahl1 +zahl2 + carry > 9)
    {string[i] = zahl1+zahl2+carry-10+'0'; carry=1;}
    else
    {string1[i] = zahl1+zahl2+carry+'0'; carry=0}
    };
    //anführende Nullen "löschen"

    temp = string1;
    while (*temp == '0') temp++;
    //Ausgabe
    printf("\nDas Ergebnis ist %s\n",temp);
    //Freigabe
    free(string1);
    free(string2);
    };



  • Welche Fehlermeldung? Versuchs mal mit Code-Tags.

    Ansonsten hast du hinter deiner for schleife (wo der erste Fehler war) direkt ein Semikolon, und dann kommt ein Block in geschweiften Klammern, der sicherlich zu der for-schleife gehört. Da muss das Semikolon weg! Da sind eh insgesamt ein paar viele Semikolons (oder wie auch immer der Plural da sein mag):

    [cpp]for (i=len; i>=0, i--); <--(HIER ZEIGT ER EINEN FEHLER AN)
    {
    zahl1 = string1[i]-`0`; // die hochkommas da sind die falschen!
    zahl2 = string2[i]-'0'; // die sind besser!

    if (zahl1 +zahl2 + carry > 9)
    {
    string[i] = zahl1+zahl2+carry-10+'0'; carry=1;
    }
    else
    {
    string1[i] = zahl1+zahl2+carry+'0'; carry=0**;** // hier fehlt n semikolon
    }
    }; [/cpp]

    hab ma alles unterstrichen was falsch ist.

    EDIT: zumindest alles um die for-schleife rum 😉


Anmelden zum Antworten