Pythagoreische Tripel



  • Hallo,
    Es gilt ja in einem rechtwinkligen dreieck c² = a² + b², wir sollen ein programm schreiben das alle pythaogerischen tripel bis z.b. c=100 findet. Das erste wäre z.b. für c=5 : 5² = 3² + 4²

    Ich hab das programm nun soweit (funktioniert auch)

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
        cout<<"Satz des Pythagoras: c² = a² + b², Ausgabe von allen Trippeln bis c=500:\n";
    
        int a,b,c;
    
        for (c=1; c<501; ++c)
        {
            for(a=1; a*a<c*c; ++a)
            {
                for(b=1; b*b<c*c; ++b)
                {
                    if (a*a + b*b == c*c)
                    {
                        cout<<c<<"² = ";
                        cout<<"\t"<<a<<"² + "<<b<<"² \n";
                    }
                    else ;
                }
            }
        }
        return 0;
    }
    

    Allerdings soll das programm bei c=5 z.b. nur 5² = 3² + 4² ausgeben, aber nicht 5² = 4² + 3². Weiß wer wie ich das mach?



  • mit deiner lösung: indem du die bedingung an der passenden stelle einbaust, dass (a < b) - du könntest das auch gleich in die schleife einbauen (statt b=1).


  • Mod

    b*b<c*c
    

    Dein Ernst, Bruder?

    int a,b,c;
       
        for (c=1;
    

    Aber Bruder...! Sag, hast du denn gar keinen Anstand!?

    Lösung deines Problems ist b*b<a*a als Bedingung der innersten Schleife zu verwenden - oder b < a , falls du noch mein Bruder sein möchtest.



  • Damit kannst Du Deinen Lehrer erschrecken:

    int N = 500;
        for( int m=2, n=1; m*m < N; (n+=2)>m? (n=(++m)%2? 2: 1): int() )
        {
            int a = m*m - n*n;
            int b = 2*m*n;
            int c = m*m + n*n;
            for( int factor = 1; factor*c <= N; ++factor )
                cout << factor*c << "^2 = " << factor*b << "^2 + " << factor*a << "^2" << endl;
        }
    


  • danke.

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
        cout<<"Satz des Pythagoras: c² = a² + b², Ausgabe von allen Trippeln bis c=500:\n";
    
        int a,b,c;
    
        for (c=5; c<501; ++c)
        {
            for(a=1; a<c; ++a)
            {
                for(b=1; b<c, b<a; ++b)
                {
                    if (a*a + b*b == c*c)
                    {
                        cout<<c<<"² = ";
                        cout<<"\t"<<a<<"² + "<<b<<"² \n";
                    }
                    else ;
                }
            }
        }
        return 0;
    }
    


  • b<c, b<a
    

    macht nicht, was du denkst (aktiviere mal die Warnungen!).
    Wenn du willst, daß beide Bedingungen gelten sollen, dann

    b<c && b<a
    


  • Wie aktivier ich die warnungen? Habe netbeans mit cygwin compiler. Bei dem compile-kommando "g++ -c -g -MMD -MP -MF "build/Debug/Cygwin-Windows/main.o.d" -o build/Debug/Cygwin-Windows/main.o main.cpp" steht auch kein -w , also sind die wohl echt deaktiviert.



  • Such einfach mal im Internet nach "netbeans c++ compiler options".



  • Hallo vivess,

    Bei jeder Programmierung sollte man zumindest so weit über Performance nachdenken, als es gilt unnötige Programmläufe zu vermeiden.

    Hier eine Alternative:
    Ich beginne - genau wie Du - mit einer Schleife über alle potentiellen Werte von c. Als nächstes dann gehe ich davon aus, dass immer c>b>a gilt. Wenn man also mit einer Schleife über alle b weiter macht, stellt sich die Frage wie groß bei einem gegebenen c das kleinste potentielle b sein kann. Und wenn ich ein b und ein c habe, so kann ich doch ein potentielles a bestimmen, ohne eine dritte Schleife auf zu machen.

    Das ganze in Code:

    #include <iostream>
    #include <cmath> // std::sqrt
    
    using namespace std;
    
    int main()
    {
        cout<<"Satz des Pythagoras: c² = a² + b², Ausgabe von allen Trippeln bis c=500:\n";
        int N = 500;
        double W2H = sqrt(2.)/2;    // diese Konstante benötigen wir später
        for( int c = 5; c <= N; ++c )   // Variablen so lokal wie möglich deklarieren
        {
            for( int b = int(c*W2H)+1; b < c; ++b ) // das kleinste potentielle b ist ceil(0.5*sqrt(2)*c)
            {
                int a_sqr = c*c - b*b;    // a*a = c*c - b*b
                int a = int(sqrt(double(a_sqr)));
                if( a*a == a_sqr )          // prüfe, ob 'a_sqr' eine Quadratzahl ist
                    cout << c <<"² = " << "\t" << a << "² + " << b << "² \n";
            }
        }
    }
    

    Diese Variante braucht nur ca 36000 Durchläufe, um alle Tripel unter 500 zu finden. Im Gegensatz zu Deiner mit über 20Millionen. Die Variante von 'Kenner des Pythagoras' kommt im Übrigen mit weniger als 400 Durchläufen aus. Aber das ist eine andere Geschichte

    Gruß
    Werner


Anmelden zum Antworten