Langzahlarithmethik mit Arrays
-
Hallo liebes Forum,
Ich hänge gerade an folgendem Problem.
Ich habe zwei Arrays:lnum1[4] = {10, 88, 3, 11}
lnum2[4] = {4, 12, 18, 127}Die Elemente sind wie folgt aufgebaut. E[0] = 2^0 E[1] = 2^8 E[2] = 2^16 usw...
Nun multipliziere ich die Elemente der Arrays miteinander um folgende Kombination zu erhalten. Welche ich danach in ein doppelt so großes result Array schreibe.
r[0] (10*4) 2^0 +
r[1] (10*12 + 88*4) 2^8 +
r[2] (10*18 + 88*12 + 3*4) * 2^16 +
r[3] (10*127 + 88*18 + 3*12 + 11*4) * 2^24 +
r[4] (88*127 + 3*18 + 11*12) * 2^32 +
r[5] (3*127 + 11*18) * 2^40 +
r[6] (11*127) * 2^48
r[7] (0)Die Frage die sich mir nun stellt ist: Wie implementiere ich eine Schleife um auf folgende Kombinationen zu kommen? Und zusätzlich soll die Schleife für n große Arrays funktionieren.
Grüße,
buRny
-
Könntest du deine Frage etwas genauer stellen? "Wie implementiere ich eine Schleife ...?" Mit for, while, do, zur Not auch goto. Wo ist genau dein Problem? "...soll die Schleife für n große Arrays funktionieren. " Dann benutz n. Wo ist genau dein Problem?
-
Das sieht nach Polynommultiplikation aus (mit x = 28)
Du brauchst zwei verschachtelte Schleifen.
Die Größe deines Produkarrays (Ergebnis) kannst du wohl selber bestimmen.
Der Index in diesem Produktarray ist die Summe der Indizes der FaktorarraysP[i+j] += I1[i] * I2[j];
Das du das Produktarray vorher mit 0 inititalisieren musst, sollte klar sein.
-
Klar kann ich das machen. Wie Schleifen benutzt werden weiß ich.
Um das Problem einfach herunter zu brechen zeige ich noch ein Beispiel:
num1[4]={1,2,3,4}
num2[4]={5,6,7,8}Nun möchte ich die beiden Arrays wie folgt multiplizieren um auf ihre Kombinationen zu gelangen.
1. 15_______________= 5
2. 2*5 + 1*6__________= 16
3. 3*5 + 2*6 + 17_____= 34
4. 4*5 + 3*6 + 2*7 + 1*8 = 60
5. _____4*6 + 3*7 + 28 = 61
6. __________4*7 + 3*8 = 52
7. _______________48 = 32Mein Problem ist jetzt wie ich diese Sieben fälle programmieren soll, weil ich keinen vernünftige Ansatz für dieses Muster habe. Hoffe das Problem wurde besser geschildert. ( Die Unterstriche sind dafür da um das Muster besser zu erkennen)
-
Ich hab mal den Index anders nummeriert
0. 1*5 = 5 | = I1[0]*I2[0] 1. 2*5 + 1*6 = 16 | = I1[0]*I2[1] + I1[1]*I2[0] 2. 3*5 + 2*6 + 1*7 = 34 | = I1[0]*I2[2] + I1[1]*I2[1] + I1[2]*I2[0] 3. 4*5 + 3*6 + 2*7 + 1*8 = 60 4. 4*6 + 3*7 + 2*8 = 61 5. 4*7 + 3*8 = 52 | = I1[3]*I2[2] + I1[2]*I2[3] 6. 4*8 = 32 | = I1[3]*I2[3]
Jetzt schau dir mal den Index vom Ergebnis an und die Indizes von der Rechnung
Bei 2 sind die Indizes 0+2 und 1+1 und 2+0
Bei 5 sind die Indizes 3+2 und 2+3Ob da ein Zusammenhang ist?
-
[quote="DirkB"]Ich hab mal den Index anders nummeriert
0. 1*5 = 5 | = I1[0]*I2[0] 1. 2*5 + 1*6 = 16 | = I1[0]*I2[1] + I1[1]*I2[0] 2. 3*5 + 2*6 + 1*7 = 34 | = I1[0]*I2[2] + I1[1]*I2[1] + I1[2]*I2[0] 3. 4*5 + 3*6 + 2*7 + 1*8 = 60 4. 4*6 + 3*7 + 2*8 = 61 5. 4*7 + 3*8 = 52 | = I1[3]*I2[2] + I1[2]*I2[3] 6. 4*8 = 32 | = I1[3]*I2[3]
Jetzt schau dir mal den Index vom Ergebnis an und die Indizes von der Rechnung
Bei 2 sind die Indizes 0+2 und 1+1 und 2+0
Bei 5 sind die Indizes 3+2 und 2+3Ob da ein Zusammenhang ist?[/quote]
Oh, Wunder JA
Sorry, das ich erst so spät zurück schreibe. Saß an dem Programm. Danke für deine Hilfe.
Folgendes habe ich jetzt implementiert und es funktioniert.
#include <stdio.h> #include <stdlib.h> int main(void) { unsigned char lnum1[4] = { 1, 2, 3, 4 }; unsigned char lnum2[4] = { 5, 6, 7, 8 }; unsigned char res[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int i, j; for (i = 0; i < sizeof(lnum1); i++) { for (j = 0; j < sizeof(lnum2); j++) { res[i + j] += lnum1[i] * lnum2[j]; printf("%d = %d * %d = %d\n", i+j,lnum1[i], lnum2[j], (lnum1[i]*lnum2[j])); } } //print result array puts("\nResult Array"); for (i = 0; i < sizeof(res); i++) { printf("%d ", res[i]); } return EXIT_SUCCESS; }
-
sizeof liefert die Größe in Byte.
Das funktioniert bei dir nur, weil deine Datentypen dabei vom Typ char sind.Wenn ich mir die Werte aus deinem Eröffnungspost anschaue, wird der Daetenbereich von unsigned char aber nicht reichen.
Wenn du auf int umsteigst, kannst du dannsizeof(lnum1)/sizeof(lnum1[0])
nehmen.
-
Leider Gottes wird es so in der Aufgabenstellung die ich erhalten habe so verlangt. Überläufe sind dementsprechend vorprogrammiert. Deshalb muss ich diese mit Bedingungen abfangen und bearbeiten. Der Prof hat eh eine an der Waffel
-
buRny schrieb:
Leider Gottes wird es so in der Aufgabenstellung die ich erhalten habe so verlangt. Überläufe sind dementsprechend vorprogrammiert. Deshalb muss ich diese mit Bedingungen abfangen und bearbeiten. Der Prof hat eh eine an der Waffel
Ich wage mal zu behaupten, dass du irgendeine Klausel in der Aufgabenstellung falsch verstanden hast oder zu streng interpretierst. Ist es möglich, die Aufgabenstellung im Wortlaut wiederzugeben?
-
Mag sein. Trotzdem erstmal vielen Dank für die Hilfe. Mache mich mal an die weiteren Aufgabenteile.