Summe von a+b+c=1000 -> Lösungen in Arrays speichern


  • Mod

    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.
    Bei short statt int 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 🙂


Anmelden zum Antworten