Pythagoreische Tripel in Java?
Hallo, ich muss folgende Aufgabe lösen mit Java (Eclipse), Drei positive, ganze Zahlen a < b < c mit a^2 + b^2 = c^2 bezeichnet man als Pythagoreische Tripel. Lassen Sie die Werte für alle Tripel, die die Bedingung a + b + c = 800 erfüllen, berechen und ausgeben. Mir ist bewusst, dass ich mit for-Schleife arbeiten muss jedoch weiß ich nicht wie ich es umsetzen soll. Ich wäre für jede Hilfe dankbar. Dankeschön im Vorraus :)
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.
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.
Mit dem Schleifen hab ich es verstanden, aber wie soll ich das prüfen und mit dem berechnen meinst du etwa mit println?
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 + " ");
}
}
Das ist falsch. Es soll nicht 800 rauskommen,
sondern die Summe a+b+c soll 800 sein.
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.
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.
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.
Die schnellste Methode, sofern erlaubt, ist der Ansatz mit der euklidischen Formel, siehe auch: http://www.arndt-bruenner.de/mathe/scripts/pythagotripel.htm
du könntest theoretisch mit 3 verschachtelten FOR achleifen
In diesem Fall nicht.