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 🙂


  • Mod

    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 Faktorarrays

    P[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 + 1
    7_____= 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. _______________4
    8 = 32

    Mein 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+3

    Ob 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+3

    Ob 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 dann

    sizeof(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 😃


  • Mod

    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.


Anmelden zum Antworten