Frage

Ich versuche Projekt Euler # 9, zu lösen, die http: // projecteuler.net/index.php?section=problems&id=9 .

Ich habe durch diesen Code aussehen, und die Logik scheint recht ... aber ich bin nicht immer alle Ausgabe überhaupt, nicht einmal die printfs in der Schleife. Ich bin (natürlich) ein C Neuling, versucht, von höheren Sprachen lernen ... könnten Sie mir sagen, was los ist falsch?

#include <stdio.h>

int main(){
    unsigned int a=0, b=0, c=0;
    short int pass=0;
    while(!pass){
        //printf("a = %4d\n", a);
        a++;
        b=a;
        while(!pass){
            b++;
            c=1000-a-b;
            if(b>=c) break;
            if(a*a+b*b==c*c) pass = 1;
        }
    }
    printf("a=%d, b=%d, c=%d, a*b*c=%d, a+b+c=%d\n", a, b, c, a*b*c,a+b+c);
    return 1;
}

Vielen Dank.

EDIT:. Okay, ich habe die Floating-Point-Problem behoben, wie oben gezeigt, aber jetzt eine geht nie aus irgendeinem Grund über zwei, es Schleife macht unendlich

EDIT: Ich habe einige Fehler behoben, aber immer noch, es gibt a=33, b=483, c=484, a*b*c=7714476, a+b+c=1000, das Recht nicht ganz. : (

Wow, ich war overcomplicating es. Es funktioniert jetzt. Vielen Dank an alle.

War es hilfreich?

Lösung

if(floor(sc) != sc) continue; // we only want integer values of c

Es ist möglich, dass das floor(sc) immer inequel zu sc. Da sc eine doppelt so hoch ist, Operationen an wird es kleine Fehler einführen. Versuchen Sie, eine kleine Variable definieren „nahe genug“ und überprüft, um anzuzeigen, wenn es innerhalb dieses Bereichs ist. Siehe hier für Strategien, um diesen.

Nicht sicher, ob es noch andere Probleme mit Ihrem Code.

Andere Tipps

nicht vergleichen Gleitkommazahlen == oder != verwenden. Gleitkommazahlen können alle Arten von Tricks auf Sie spielen. Stattdessen versuchen zu überprüfen, ob sc in einigem geeignet kleinen Bereich in der Nähe einer ganzen Zahl ist, und Sie werden mehr Glück haben.

Projekt Euler Problem # 9 benötigt keine Quadratwurzeln noch schwimmt.

Wenn die Werte ‚a = 1‘, ‚b = 2‘ in dem ersten Durchlauf der inneren Schleife nicht (da die v5 keine ganze Zahl ist), geht die Schleife um wieder mit ‚A = 1‘ und ‚b = 3‘ und schlägt fehl, weil v10 keine ganze Zahl ist, und in der Tat gibt es keinen Wert von N von Null (die von der Schleife ausgeschlossen ist), für die v (N 2 + 1 2 ) selbst eine ganze Zahl ist.

Also, bis Sie Bereich ablaufen, bei denen getrennte ganzzahlige Werte trennbar sind, wird auch weiterhin der Code ausgeführt wird.

Der Code im Zusammenhang mit ‚bestanden‘ und den Bedingungen if(b>=c) break; und (noch mehr) if( (a-- + b-- + c) == 7) pass=1; sind völlig undurchschaubar. Geben Sie den Code dort deutlicher. Ich werde nicht einmal versuchen und zu erraten, was das tut; Ich nehme an, es soll den Bereich begrenzen, so dass ‚a + b + c‘ nicht größer als 7 ist, oder so, aber ich glaube nicht, dass es die gewünschte Wirkung erzielen -. Auch wenn Sie es jemals bekommen ausführen

referenzieren Projekt Euler Seite wird Sie bedeutet einen pythagoreischen Tripel 'a, b, c', so dass 'a

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top