Summe von a+b+c=1000 -> Lösungen in Arrays speichern
-
Ich merke auch gerade, dass ich dann die ganze Arrays neu durchkämmen müsste um die dann in einem neuen Array zu speichern. Das ist alles sehr aufwendig und mir passieren auch Syntaxfehler, die ein Vorankommen gerade grauenhaft machen.
Ich werde euch zur Liebe das nicht posten, was ich da gerade zusammengecoded habe. Die Hinweise waren aber schon Mal sehr hilfreich. Ich werde mich später nochmal ran setzen und mit dem Gedanken alles innerhalb der for-Schleifen zu lösen probieren und mich später anderen Aufgaben widmen.
Zu aller Letzt noch, warum sind die VLAs verpönt bzw. was ist problematisch an denen? Das soll meine letzte Lektion im Zusammenhang mit dieser Aufgabe sein.
-
C_Newbe schrieb:
Ich merke auch gerade, dass ich dann die ganze Arrays neu durchkämmen müsste um die dann in einem neuen Array zu speichern. Das ist alles sehr aufwendig und mir passieren auch Syntaxfehler, die ein Vorankommen gerade grauenhaft machen.
Kein Problem, auch das übernehme ich gerne. Inklusive der Fehler.
Ein Array auf dem Stack ist üblicherweise maximal 1 Megabyte groß oder maximal 4 Megabyte groß. Hier brauchen wir viel viel mehr. Deswegen muss es auf dem Heap sein. Das mache ich mit malloc()/free().
Zur Übung mache ich mal die einigermaßen sinnvollen Tripel mit a<b<c und a+b+c==1000 in die Arrays rein und werte danach erst die Tripel aus.
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int* solA=malloc(1000000000*sizeof(int)); int* solB=malloc(1000000000*sizeof(int)); int* solC=malloc(1000000000*sizeof(int)); int varPos=0; int a, b, c, i; for (a=1;a<1000;a++){ for(b=a+1;b<1000;b++){ for(c=b+1;c<1000;c++){ if(a+b+c==1000){ solA[varPos]=a; solB[varPos]=b; solC[varPos]=c; varPos++; } } } } for(i=0;i<varPos;i++){ if(solA[i]*solA[i]+solB[i]+solB[i]==solC[i]*solC[i]){ printf("%d %d %d\n",solA[i],solB[i],solC[i]); } } free(solA); free(solB); free(solC); return EXIT_SUCCESS; }
C_Newbe schrieb:
Ich werde euch zur Liebe das nicht posten, was ich da gerade zusammengecoded habe.
Das ist nett. Aber ich hab's verkackt!!!
Die total simple Umsetzung des Programms in ein ein wenig umständlicheres ist nicht geglückt. Es zeigt das Ergebnis nicht an. Ich kann draufstarren wie ich will. Alle Zeilen stimmen. Kacke. Debuggen ist ätzend. Und ich wüßte auch nicht, wie ich so ein Programm debuggen sollte, alle 1000000000 Kombinationen anschauen und aufmerksam bemerken, wenn was falsch wird.
-
Zeile 24:
if(solA[i]*solA[i]+solB[i]*solB[i]==solC[i]*solC[i]){ // ^
-
Also ich weiß mittlerweile wo der Hund begraben liegt und mit dem Ansatz, den ich verfolgt habe bekomme ich kein Ergebnis zu Stande. Ich poste trotzdem noch mal abschließend das, was ich unter dem Strich als selbst entwickelten Gedanken entworfen hatte.
Funktioniert aber nicht (alleine der Anfang erzeugt immer noch diesen Fehler) _
#include <stdio.h> #include <stdlib.h> #include <math.h> /* * */ int main(int argc, char** argv) { int a, b, c; int varPos = 1000; int solA[varPos], solB[varPos], solC[varPos]; varPos = 0; for (a=0;a<1000;a++){ for(b=0;b<1000;b++){ for(c=0;c<1000;c++){ if (a+b+c==1000){ solA[varPos] = a; solB[varPos] = b; solC[varPos] = c; varPos++; } } } } int solutionsA=varPos; varPos=0; while (varPos != solutionsA){ if (solA[varPos]>solB[varPos] && solA[varPos]>solC[varPos] && //a is biggest pow(solA[varPos],2) == pow(solB[varPos],2) + pow(solC[varPos],2)){ printf ("%d,&d,%d\n", solA[varPos], solB[varPos], solC[varPos]); } else if (solB[varPos]>solC[varPos] %% solB[varPos]>solA[varPos] && //b is biggest pow(solB[varPos],2) == pow(solA[varPos],2) + pow(solC[varPos],2)){ printf ("%d,&d,%d\n", solA[varPos], solB[varPos], solC[varPos]); } else if (solC[varPos]>solA[varPos] %% solC[varPos]>solB[varPos] && pow(solC[varPos],2) == pow(solA[varPos],2) + pow(solB[varPos],2)){ } varPos++; } return (EXIT_SUCCESS); }
-
C_Newbe schrieb:
Also ich weiß mittlerweile wo der Hund begraben liegt und mit dem Ansatz, den ich verfolgt habe bekomme ich kein Ergebnis zu Stande. Ich poste trotzdem noch mal abschließend das, was ich unter dem Strich als selbst entwickelten Gedanken entworfen hatte.
Funktioniert aber nicht (alleine der Anfang erzeugt immer noch diesen Fehler) _
Ist dir klar, das 1000 Werte im Array nicht reichen?
Alleine für a = 0 bekommst du 999 Einträge zusammen.C überprüft auch nicht, ob die Arraygrenzen eingehalten werden.
Das musst du selber machen.
-
DirkB schrieb:
C_Newbe schrieb:
Also ich weiß mittlerweile wo der Hund begraben liegt und mit dem Ansatz, den ich verfolgt habe bekomme ich kein Ergebnis zu Stande. Ich poste trotzdem noch mal abschließend das, was ich unter dem Strich als selbst entwickelten Gedanken entworfen hatte.
Funktioniert aber nicht (alleine der Anfang erzeugt immer noch diesen Fehler) _
Ist dir klar, das 1000 Werte im Array nicht reichen?
Alleine für a = 0 bekommst du 999 Einträge zusammen.C überprüft auch nicht, ob die Arraygrenzen eingehalten werden.
Das musst du selber machen.Aber ist es nicht so, dass a höchstens 1000 Werte annehmen kann, und dass b höchstens 1000 Werte annehmen kann, und dass c höchstens 1000 Werte annehmen kann?
-
Hast du den geposteten Code überhaupt mal versucht zu kompilieren? Bei mir kommt da:
c_newbe.c:31:63: warning: data argument not used by format string [-Wformat-extra-args] printf ("%d,&d,%d\n", solA[varPos], solB[varPos], solC[varPos]); ~~~~~~~~~~~~ ^ c_newbe.c:33:45: error: expected expression else if (solB[varPos]>solC[varPos] %% solB[varPos]>solA[varPos] && //b is biggest ^ c_newbe.c:35:63: warning: data argument not used by format string [-Wformat-extra-args] printf ("%d,&d,%d\n", solA[varPos], solB[varPos], solC[varPos]); ~~~~~~~~~~~~ ^ c_newbe.c:37:45: error: expected expression else if (solC[varPos]>solA[varPos] %% solC[varPos]>solB[varPos] && ^
Also: dein printf-String ist falsch und was soll das %% bedeuten?
Zur anderen Frage mit maximal 1000:
hast du mal darüber nachgedacht, dass ein Wert auch mehrfach vorkommen kann? Zum Beispiel 44*44+117*117 = 125*125 und auch 44*44+483*483=485*485. Hier kommt die 44 also doppelt vor.
-
wob schrieb:
Hast du den geposteten Code überhaupt mal versucht zu kompilieren? Bei mir kommt da:
c_newbe.c:31:63: warning: data argument not used by format string [-Wformat-extra-args] printf ("%d,&d,%d\n", solA[varPos], solB[varPos], solC[varPos]); ~~~~~~~~~~~~ ^ c_newbe.c:33:45: error: expected expression else if (solB[varPos]>solC[varPos] %% solB[varPos]>solA[varPos] && //b is biggest ^ c_newbe.c:35:63: warning: data argument not used by format string [-Wformat-extra-args] printf ("%d,&d,%d\n", solA[varPos], solB[varPos], solC[varPos]); ~~~~~~~~~~~~ ^ c_newbe.c:37:45: error: expected expression else if (solC[varPos]>solA[varPos] %% solC[varPos]>solB[varPos] && ^
Also: dein printf-String ist falsch und was soll das %% bedeuten?
Zur anderen Frage mit maximal 1000:
hast du mal darüber nachgedacht, dass ein Wert auch mehrfach vorkommen kann? Zum Beispiel 44*44+117*117 = 125*125 und auch 44*44+483*483=485*485. Hier kommt die 44 also doppelt vor.Super Danke für die Hinweise, ja jetzt habe ich die Fehler entdecken können, das doppelte %% soll eigentlich ein && sein, das habe ich gestern einfach nicht mehr entdecken können. Ich habe eine halbe Ewigkeit auf diese Zeilen geguckt um den Fehler zu finden. War wohl schon etwas spät.
Dass a, b und c einen Wert mehrmals annehmen können, daran hatte ich nicht gedacht und ich muss zugegeben nochmal in Ruhe darüber nachdenken um das zu verstehen. Ich werde mir das mal anschauen. Alles super wertvolle Hinweise für mich, danke sehr!
Korrektur der while Schleife
while (varPos != solutionsA){ if (solA[varPos]>solB[varPos] && solA[varPos]>solC[varPos] && //a is biggest pow(solA[varPos],2) == pow(solB[varPos],2) + pow(solC[varPos],2)){ printf ("%d,%d,%d\n", solA[varPos], solB[varPos], solC[varPos]); } else if (solB[varPos]>solC[varPos] && solB[varPos]>solA[varPos] && //b is biggest pow(solB[varPos],2) == pow(solA[varPos],2) + pow(solC[varPos],2)){ printf ("%d,%d,%d\n", solA[varPos], solB[varPos], solC[varPos]); } else if (solC[varPos]>solA[varPos] && solC[varPos]>solB[varPos] && pow(solC[varPos],2) == pow(solA[varPos],2) + pow(solB[varPos],2)){ printf ("%d,%d,%d\n", solA[varPos], solB[varPos], solC[varPos]); } varPos++; }
-
wob schrieb:
Zur anderen Frage mit maximal 1000:
hast du mal darüber nachgedacht, dass ein Wert auch mehrfach vorkommen kann? Zum Beispiel 44*44+117*117 = 125*125 und auch 44*44+483*483=485*485. Hier kommt die 44 also doppelt vor.Es ist ja noch schlimmer, da ja für die Einträge im Array nur die (normale) Summe genommen wird.
Das kommt dann schon bei a = 0 glatt 999 mal vor (1+999;2+998;....998+2;999+1)
-
DirkB schrieb:
wob schrieb:
Zur anderen Frage mit maximal 1000:
hast du mal darüber nachgedacht, dass ein Wert auch mehrfach vorkommen kann? Zum Beispiel 44*44+117*117 = 125*125 und auch 44*44+483*483=485*485. Hier kommt die 44 also doppelt vor.Es ist ja noch schlimmer, da ja für die Einträge im Array nur die (normale) Summe genommen wird.
Das kommt dann schon bei a = 0 glatt 999 mal vor (1+999;2+998;....998+2;999+1)Okay ich habe es verstanden also brauche ich thereotisch gesehen in meinem Code 1000^3 verschiedene Array Positionen, um meine Lösungen alle zu speichern. Ja das ist total ineffizient.
Naja gut, ich konnte wenigstens meine Idee zu Ende schreiben, und jetzt ist sie syntaktisch auch in Ordnung. Nur der Logikfehler mit den Arrays fällt mir gerade auf die Füße, aber ich habe schon Mal was gutes gelernt. Danke für den Input!
-
Mit Arrays wird das schwierig, da du dafür knapp 12 GByte brauchst.
Beishort
stattint
wären es noch 6 GByte.Um 20:01:09 10.05.2016
volkard schrieb:
Ein Array auf dem Stack ist üblicherweise maximal 1 Megabyte groß oder maximal 4 Megabyte groß. Hier brauchen wir viel viel mehr. Deswegen muss es auf dem Heap sein. Das mache ich mit malloc()/free().
-
Da muss ich wohl für mein tolles Programm Arbeitsspeicher aufrüsten
Kleiner Spaß am Rande, ich versuche Volkers Ansatz selbst nachzuentwickeln. Danach widme ich mich neuen Aufgaben. Danke für den ganzen tollen Input