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 Ergebnisszeichenkettex_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 setzenwhile (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 anzeigenreturn 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 setzenwhile (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. Dezimalstellenprintf("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