Multiplikation beliebig großer Zahlen



  • Hallo, ich muss ein programm schreiben, welches zwei zahlen als string einliest und dann multipliziert, meinen entwurf hab ich druntergestellt. Es gibt bis jetzt nur Kauderwelsch aus und ich finde meinen Fehler einfach nicht.
    Wäre super, wenn mir da jemand weiterhelfen könnte

    // 2.Programmieraufgabe: Multiplikation großer Zahlen
    // Sandra Trautmann, Markus Glaß

    #include <stdio.h>
    #include <stdlib.h>

    // tatsächliche Länge der eingelesenen Zahlen ermitteln
    int string_ende(int ds,char* string)
    {
    int i;
    for(i=0;i < ds;i++) // bis zur Terminierung gehen
    {if (string[i]==0) break;}
    i--;
    return i; // Terminierung des Strings - 1 = 1.Zeichen der Kette
    }

    /******************************************************************************/

    // Additionsfunktion
    char *addition(char *x,char y,int ds)
    {
    int x_ind; // Index für x
    int y_ind; // Index für y
    int erg_ind; // Index für Ergebnis
    int erg_term; // Index auf Terminierung v. erg
    char
    erg; // Zeiger auf Ergebnisszeichenkette

    x_ind=string_ende(ds,x); // erste Ziffern in den Zeichenketten ermitteln
    y_ind=string_ende(ds,y);

    if (x_ind > y_ind) // max. Dezimalstellen für Ergebnis ermitteln
    {erg_ind=x_ind+1;}
    else
    {erg_ind=y_ind+1;}

    erg_term=erg_ind+1;

    erg=(char*) malloc(erg_term); // Speicher für Ergebnis zuweisen

    erg[erg_term]=0; // Terminierung für Ergebniszeichenkette setzen
    erg[erg_ind]=0; // 1. Ergebnis auf Null setzen

    while (erg_ind >= 0)
    {
    if (x_ind >= 0)
    {
    erg[erg_ind]+=x[x_ind]-'0'; // aktuelle x[x_ind] zu erg[erg_ind] add.
    x_ind--; // zur nä. Stelle von x rücken f. nä. Schleifendurchlauf
    }

    if (y_ind >= 0)
    {
    erg[erg_ind]+=y[y_ind]-'0'; // aktuelle y[y_ind] zu erg[erg_ind] add.
    y_ind--; //zur nä. Stelle von y rücken f. nä. Schleifendurchlauf
    }
    if (erg[erg_ind] > 9) // führten die beiden Additionen zu Zahl > 9?
    {
    erg[erg_ind]-=10; // 10 abziehen
    erg[erg_ind-1]=1; // Übertrag in nä. Position v. erg schreiben
    }
    else
    & nbsp; {
    erg[erg_ind-1]=0; // ansonsten, nä. Pos. mit 0 initialisieren
    }
    erg[erg_ind]+='0'; // Ergebnis als ASCII-Ziffernzeichen darstellen
    erg_ind--; // Index auf nä. Pos. rücken
    }
    if (erg[0] == '0') erg[0]=' '; // führende Null nicht anzeigen

    return erg; // Rückgabewert der Funktion (=Summe v. x und y)
    }
    /******************************************************************************/
    char *multiplikation(char *x,char y,int ds)
    {
    int x_ind; // Index für x
    int y_ind; // Index für y
    int erg_ind; // Index für Ergebnis
    int mz;
    int erg_term; // Index auf Terminierung v. erg
    char
    erg; // Zeiger auf Ergebnisszeichenkette
    int x_ind_m;
    int erg_ind_m;

    x_ind=string_ende(ds,x); // erste Ziffern in den Zeichenketten ermitteln
    y_ind=string_ende(ds,y);
    erg_ind = x_ind + y_ind;
    erg_term = erg_ind +1;
    erg=(char*) calloc(1,erg_term); // Speicher für Ergebnis zuweisen
    erg[erg_term]=0; // Terminierung für Ergebniszeichenkette setzen

    while (y_ind >= 0)
    {
    x_ind_m = x_ind;
    erg_ind_m = erg_ind;
    //while (erg_ind >=0)
    //{
    while (x_ind_m>=0)
    {
    mz = (int)x[x_ind];
    while (mz>0)
    {
    erg[erg_ind_m]+=y[y_ind];
    if (erg[erg_ind_m] > 9) // führten die beiden Additionen zu Zahl > 9?
    {
    erg[erg_ind_m]-=10; // 10 abziehen
    erg[erg_ind_m-1]+=1; // Übertrag in nä. Position v. erg schreiben
    }

    mz--;
    }
    erg[erg_ind_m]+='0'; // Ergebnis als ASCII-Ziffernzeichen darstellen
    erg_ind_m--; // Index auf nä. Pos. rü cken
    x_ind_m--;
    //}

    }
    y_ind--;
    erg_ind--;
    }

    if (erg[0] == '0') erg[0]=' '; // führende Null nicht anzeigen
    return erg;
    }
    /******************************************************************************/

    int main()
    {
    char *x; // Zeiger auf Zeichenkette für 1. Zahl
    char *y; // Zeiger auf Zeichenkette für 2. Zahl
    char *erg; // Zeiger auf Zeichenkette für Ergebnis
    int ds; // Anz. der max. Dezimalstellen

    printf("Geben Sie bitte die maximale Anzahl der Dezimalstellen an : ");
    scanf("%d",&ds);

    x=(char*) malloc(ds+1); // Speicher für ds Zeichen + Stringterm. zuweisen
    printf("Geben Sie bitte die 1. Zahl ein!\n");
    scanf("%s",x);

    y=(char*) malloc(ds+1); // Speicher für ds Zeichen + Stringterm. zuweisen
    printf("Geben Sie bitte die 2. Zahl ein!\n");
    scanf("%s",y);

    //erg=addition(x,y,ds); // Funktion addition() mit den geg. Werten ausführen
    erg=multiplikation(x,y,ds);

    //printf("%s + %s\n = %s\n",x,y,erg);
    printf("%s * %s\n = %s\n",x,y,erg);

    free(x); // mit malloc() vergebenen Speicher wieder freigeben
    free(y);
    free(erg);
    system("PAUSE"); //Befehl f. MS Windows: Fenster offenhalten(Dev-C++)
    return 0;
    }

    // kompiliert und getestet mit Dev-C++ 4.9.9.0 (Compiler: Mingw) unter WinXP

    Edit by AJ: Titel geändert!



  • #include <stdio.h>
    #include <conio.h>
    
    #define SIZE 20
    
    int main(char argv,int *argc)
    {
    	char zahl1[SIZE]={0},zahl2[SIZE]={0};
    	int z1,z2,erg;
    
    	printf("Zahl1: ");
    	fgets(zahl1,SIZE,stdin);
    
    	printf("Zahl2: ");
    	fgets(zahl2,SIZE,stdin);
    
    	z1=atoi(zahl1);
    
    	z2=atoi(zahl2);
    
    	erg=z1*z2;
    
    	printf("Ergebnis: %i",erg);
    
    	getch();
    
    	return(0);
    }
    

    Das ist vnicht erlaubt oder?
    Darfst du die Strings umwandeln?

    mfg hohesC

    ⚠ Was wäre wenn hier jeder seinen Post hilfe nennen würde??? ⚠



  • hohesC schrieb:

    ⚠ Was wäre wenn hier jeder seinen Post hilfe nennen würde??? ⚠

    Dann hebe ich meinen durch Ausrufezeichen hervor. 🤡



  • SeppSchrot schrieb:

    hohesC schrieb:

    ⚠ Was wäre wenn hier jeder seinen Post hilfe nennen würde??? ⚠

    Dann hebe ich meinen durch Ausrufezeichen hervor. 🤡

    sorry - hat r@sp schon gemacht 🙂



  • Wenn es die Studienaufgabe ist, mit der ich micht auch grad beschäftige geht es hier um Große Zahlen. Int ist daher keine Option.



  • #include <stdio.h> 
    #include <conio.h>
    #include <math.h>
    #include <stdlib.h>
    
    #define SIZE 1000 //Was weis ich wieviel.... 
    
    int main(char argv,int *argc) 
    { 
        char zahl1[SIZE]={0},zahl2[SIZE]={0}; 
        long double z1,z2,erg; 
    
        printf("Zahl1: "); 
        fgets(zahl1,SIZE,stdin); 
    
        printf("Zahl2: "); 
        fgets(zahl2,SIZE,stdin); 
    
        z1=atof(zahl1); 
    
    	z2=atof(zahl2); 
    
        erg=(z1*z2); 
    
        printf("Ergebnis: %f",erg); 
    
        getch(); 
    
        return(0); 
    }
    

    mfg hohesC



  • Das Ding wird sein das es sich wohl später mal um beliebig große zahlen handeln wird oder?



  • long double
    

    sollte doch reichen oder 😉 ???

    mfg hohesC



  • hohesC schrieb:

    long double
    

    sollte doch reichen oder 😉 ???

    mfg hohesC

    Falls ich recht habe nicht, denn auch ein unsigned long hat seine Grenze 💡



  • ein String hat auch seine Grenzen. 😮



  • hohesC schrieb:

    ein String hat auch seine Grenzen. 😮

    ach vergiss es, nur weil ich mich vertippt habe 😮 😮 😮 😮 😮 😮 😮 😮 😮



  • Da war doch vor kurzem schon einmal solch eine Frage. Wie wärs mal mit der Forensuche ;).

    Der Einfachheithalber würde ich es so probieren, wie man das Addieren schon in der Grundschule gelernt hat. Noch einfacher tust du dich, wenn du die Strings erst umdrehst, dann addierst (wie in der Grundschule ;)) und das Ergebnis wieder umdrehst als String.



  • Die Frage wird jeder "Erstsemester" hier wieder stellen, der nicht suchen kann, oder sogar gern was anderes studiert hätte...



  • AJ
    **

    ihr habt in der Grundschule mit "umgedrehten" Strings gerechnet? Ziemlich strange. Wir haben einfach von hinten angefangen. 😉

    bye

    tt



  • TheTester schrieb:

    AJ
    **

    ihr habt in der Grundschule mit "umgedrehten" Strings gerechnet? Ziemlich strange. Wir haben einfach von hinten angefangen. 😉

    bye

    tt

    Weißt du, in der Grundschule hatten wir schon C-Unterricht 🤡 .



  • wir hatten auch noch das A und B dazu ;P


Anmelden zum Antworten