Pythagoreische Tripel in Java?

5 Antworten

Es gibt viel Möglichkeiten, dies zu lösen, einige sind schnell programmiert, aber ineffizient (z.b. 3 For-Schleifen ineinander von jeweils 1 bis 800 und dann jeweils alle 3 Bedingungen prüfen.)

Ein wenig Nachdenken verhilft hier zu mehr Effizienz:

Zunächst die Frage von wo bis wo die Schleife von a laufen soll.

Da die Bedingung ist a<b<c, sind bei festem a die minimalen Werte für b = a+1 und für c = a+2

Die Summe daraus a + a+1 + a+2 = 3a+3 sollte 800 ergeben.
Das größte a, mit dem sich die Forderungen erfüllen lassen ist 265.
a braucht also nur von 1 bis 265 zu laufen.

Dies würde ich in einer For-Schleife machen.

Der Startwert für b wird festgelegt mit a+1.

b würde ich aber nicht in erer For-Schleife durchalufen, sondern in einer While-Schleife:
c = 800 - a - b
während c>b ist, wird die b-Schleife durchlaufen:
ist a² + b² = c² -> ja -> ausgeben

b um eins erhöhen, neues c bestimmern, neuer Schleifensurchlauf.

Tipp: Wenn du zwei der Variablen belegst, ergibt sich die dritte automatisch. Du brauchst also nur zwei for-Schleifen zu verschachteln, nicht 3.

Tannibi  22.11.2017, 16:48

Auch negative Zahlen sind deine Freunde.

In diesem Fall nicht.

0

Das kleinste Tripel ist 3, 4, 5.

Du brauchst also eine Schleife von 3 bis 800 für a
und eine darin liegende von a+1 bis 800 für b.
Ein paar Werte könnte man sich sparen,
das ist aber nicht nötig.

Jeweils ausrechnen und die Wurzel aus
dem Ergebnis auf Ganzzahligkeit prüfen.

mathegenie96 
Fragesteller
 22.11.2017, 17:17

Mit dem Schleifen hab ich es verstanden, aber wie soll ich das prüfen und mit dem berechnen meinst du etwa mit println?

0
mathegenie96 
Fragesteller
 22.11.2017, 17:26
@mathegenie96

Ich glaub ich hab es 

for (int a = 3; a <= 800; a++) {
for (int b = 4; b <= 800; b++) {

if (a * a + b * b == 800) {
System.out.println(a + " " + b + " ");

}
}

0
Tannibi  22.11.2017, 17:28
@mathegenie96

Das ist falsch. Es soll nicht 800 rauskommen,
sondern die Summe a+b+c soll 800 sein.

0
mathegenie96 
Fragesteller
 22.11.2017, 17:34
@Tannibi

Dann würde ich noch eine for-Schleife benutzen und

 if (a * a + b * b+ c*c== 800) { 

System.out.println(a + " " + b + " " + c + " ");

so müsste es dann gehen.

0
Tannibi  22.11.2017, 17:45
@mathegenie96

Das ist wieder falsch.

a + b + c soll 800 sein, nicht die Quadrate.

Du musst zuerst c ausrechnen, testen, ob
die Wurzel ganzzahlig ist, wenn ja: testen,
ob a + b + c ist, und wenn beides zutrifft,
hast du ein Ergebnis.

0
gfntom  22.11.2017, 19:46
@mathegenie96

a brauchst du nur bis 265 laufen lassen (siehe meine Antwort). b läuft weg bei a+1. (Da a <b sein muss).

Zudem kannst du die Schleife für b abbrechen, sobald b>=c ist (da b < c sein muss)

Wenn du das befolgst, brauchst du auch die Bedingung a <b <c nicht explizit abzufragen.

0

du könntest theoretisch mit 3 verschachtelten FOR achleifen