Frage von Alinchen24, 65

Kann mir einer helfen meinen logischen Fehler zu finden (geht um das phytagoras triplett)?

include

include

# include <stdio.h>

# include <math.h>

int main(){

int a=0;

int b=1;

int c=2;

while (a<b){

while (b<c){

if (pow(a,2)+pow(b,2) == pow(c,2)){

printf("Triplett: a=%i,b=%i, c=%i", a,b,c);

}

a++;

b++;

c++;

}

}

return 0;

}

Nun meine frage : Warum findet der kein triplett bzw gibt nix aus? er geht doch alles durch bzw die 2 while schleifen (die immer stimmen )und guckt dann ob a hoch 2 + b hoch 2 gleich c^2 ist (if schleife) und gibt ggf das triplett aus, wenn alle 3 bedinungen erfüllt sind?

Danke fur die hilfe schonmal :)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von EyeBook888, 36

Hallo,

dein Problem ist wahrscheinlich das er immer alle drei Werte um 1 erhöht.

Beim 1. Durchlauf ist

a=0; b=1; c=2;

Beim 2. 

a=1; b=2; c=3;

Beim 3. 

a=2; b=3; c=4;

Beim 4. 

a=3; b=4; c=5;



Höchstwahrscheinlich kann die Bedingung a^2 + b^2 = c^2 nicht stimmen , wenn b um einen höher ist als a und c um 2 höher als a. Deshalb findet er nichts.

Kommentar von Alinchen24 ,

dankeschön :)

Kommentar von ceevee ,

Einmal das und dann hast du da Endlosschleifen drin, die beiden while-Schleifen sind immer erfüllt. Ich würde das Problem eher ungefähr so lösen:

int a,b,c;
for (a = 1; a < 1000; a++) {
for (b = a; b < 1000; b++) {
for (c = b; c < 1000; c++) {
if ((a * a) + (b * b) == (c * c)) {
printf("Triplett: a=%i,b=%i, c=%i\n", a,b,c);
}
}
}
}
Kommentar von Suboptimierer ,

Dein Programm gibt alle Kombinationen aus drei natürlicher Zahlen von 1 bis 999 aus, bei denen der Satz des Pythagoras greift. Diese Zahlen müssen nicht unbedingt hintereinander kommen.

Kommentar von ceevee ,

Ich geb nicht alle Kombinationen aus, sondern nur die (bzw. in der Reihenfolge), bei denen a am kleinsten ist. 

Kommentar von Suboptimierer ,

3² + 4² = 5²

Hier müsste eine Ausgabe erfolgen.

____________________

Dass es sich um eine Endlosschleife handelt (und genauso gut dort while(1) stehen könnte, wurde bereits erwähnt.

Kommentar von ralphdieter ,

Hier müsste eine Ausgabe erfolgen.

Nö; erst beim nächsten flush().

Kommentar von Suboptimierer ,

DH! Du bist gut darin, ein "Aber" zu finden.
Dem Fragesteller wird diese Info sehr nutzen!

Antwort
von Suboptimierer, 22

Ich sehe den Fehler nicht, aber versuch mal, die Schleifen und die Quadratur umzuprogrammieren:

for(int i=1;i<1000;i++)
  if( i*i + (i+1)*(i+1) == (i+2)*(i+2) )
    printf("Triplett: a=%i, b=%i, c=%i", i, i+1, i+2);
Kommentar von ceevee ,

Das zweitkleinste Pythagoreische Tripel ist (5,12,13). Ich glaube nicht, dass du das mit dem Programm rauskriegen würdest. ;)

https://de.wikipedia.org/wiki/Pythagoreisches_Tripel

Kommentar von Suboptimierer ,

Ups stimmt.

Ich dachte, er sucht nach drei aufeinander folgenden Zahlen, für die a² + b² = c² gilt.

Kommentar von Alinchen24 ,

habs schon aber danke trz :)

Kommentar von Suboptimierer ,

Bitte! War ein Missverständnis.

Keine passende Antwort gefunden?

Fragen Sie die Community