Hallo, ich habe vor in c++ einen Algorithmus zu schreiben, der so lange mithilfe einer While-Schleife die Variablen der Gleichung 82*(a^8-a^4)/b*c*d = ergebnis (Bedingungen: a>1; b,c,d >10 && int; ergebnis muss ganzzahlig sein) erhöht, bis die Variable ergebnis ein Integer Wert hat. Dabei habe ich das Problem, dass ich keine Lösung finden kann, die While-Schleife an der Stelle zu stoppen, an der die Variable ergebnis durch die implizierte Umwandlung in einen Integer gewandelt wird. Ich wäre euch wirklich dankbar, wenn mir jemand bei diesem Problem weiterhelfen und seine Gedanken zu dem Thema posten könnte.^^ Vielen Dank schon mal im Voraus Razeradio^^
:
Verschoben durch Moderator
while (condition) { } oder auch: while (1) { // rechne if ( condition) break; } Zeig mal, was Du bis jetzt hast.
Wenn ich dich richtig verstanden habe, suchst du sowas:
1 | if (irgendwas) |
2 | break; |
Die Frage geht wohl eher in die Richtung
1 | while(Ergebnis!=(int)Ergebnis) |
Razeradio schrieb: > an der die Variable ergebnis > durch die implizierte Umwandlung in einen Integer gewandelt wird. Was für eine implizite Umwandlung? Ich nehme mal an deine Variablen sind float/double Zahlen? Die bleiben auch immer float/double, die werden nicht alleine zu Integern. Vermutlich möchtest du wissen ob die float/double Zahl eine ganze Zahl ist, d.h. keine Nachkommastellen hat? Dann ist diese Lösung Dussel schrieb: > while(Ergebnis!=(int)Ergebnis) falsch, denn das funktioniert nicht mit float/double Werten die größer sind als der maximale int-Wert. Das geht eher mit
1 | while (Ergebnis != std::floor (Ergebnis)) |
denn hier wird nichts mit Integern gemacht. Aber Achtung: Was ist mit z.B: 3.000000000001? Willst du das als ganze Zahl rechnen, da bei exakter Rechnung (also ohne die Rundungsfehler die der PC macht) hier vielleicht tatsächlich 3 das Ergebnis ist? Dann solltest du eher den Abstand betrachten:
1 | while (std::abs(f - std::round(f)) > 0.000001) |
Razeradio schrieb: > Hallo, > > ich habe vor in c++ einen Algorithmus zu schreiben, der so lange > mithilfe einer While-Schleife die Variablen der Gleichung > 82*(a^8-a^4)/b*c*d = ergebnis (Bedingungen: a>1; b,c,d >10 && int; > ergebnis muss ganzzahlig sein) erhöht, bis die Variable ergebnis ein > Integer Wert hat. > > Dabei habe ich das Problem, dass ich keine Lösung finden kann, die > While-Schleife an der Stelle zu stoppen, an der die Variable ergebnis > durch die implizierte Umwandlung in einen Integer gewandelt wird. > > Ich wäre euch wirklich dankbar, wenn mir jemand bei diesem Problem > weiterhelfen und seine Gedanken zu dem Thema posten könnte.^^ > > Vielen Dank schon mal im Voraus > Razeradio^^ Das wird m.E. nur über einen Umweg was werden. Ich würde den Nachkommaanteil von Ergebnis auf =0 prüfen. (bei Ergebnis vom Datentyp double oder long double, bei float dürften die Rechenungenauigkeiten zu groß werden) Dazu würde ich den Gleitkommaanteil auf eine bestimmte Stelle nach dem Komma runden lassen, z.B. die 8. oder 10. und dann diesen gerundeten Teil mit 0 vergleichen.
:
Bearbeitet durch User
Programmierer schrieb: > Dann ist diese Lösung > Dussel schrieb: >> while(Ergebnis!=(int)Ergebnis) > falsch, denn das funktioniert nicht mit float/double Werten die größer > sind als der maximale int-Wert. Das war ein Beispiel. Er kann natürlich auch nach long long konvertieren, wenn er es braucht. Für noch größere Wertebereiche geht es dann nicht mehr, aber das ist dann schon eher ein Spezialfall. Razeradio schrieb: > bis die Variable ergebnis ein Integer Wert hat. Es war sowieso nur Integer gefordert ;-)
Razeradio schrieb: > ich habe vor in c++ einen Algorithmus zu schreiben, der so lange > mithilfe einer While-Schleife die Variablen der Gleichung > 82*(a^8-a^4)/b*c*d = ergebnis Sollte das nicht 82*(a^8-a^4)/(b*c*d) = ergebnis heißen (also mit Klammeern um b*c*d? Ist '^' der Potenz- oder der XOR-Operator? Falls nur irgeneine Lösung gefordert ist, würde ich eine solche im Kopf ausdenken und dann ein Programm schreiben, was nur eine einzelne printf- bzw. cout-Anweisung mit dieser Lösung enthält ;-)
Razeradio schrieb: > Hallo, > > ich habe vor in c++ einen Algorithmus zu schreiben, der so lange > mithilfe einer While-Schleife die Variablen der Gleichung > 82*(a^8-a^4)/b*c*d = ergebnis (Bedingungen: a>1; b,c,d >10 && int; > ergebnis muss ganzzahlig sein) erhöht, bis die Variable ergebnis ein > Integer Wert hat. > > Dabei habe ich das Problem, dass ich keine Lösung finden kann, die > While-Schleife an der Stelle zu stoppen, an der die Variable ergebnis > durch die implizierte Umwandlung in einen Integer gewandelt wird. > > Ich wäre euch wirklich dankbar, wenn mir jemand bei diesem Problem > weiterhelfen und seine Gedanken zu dem Thema posten könnte.^^ > > Vielen Dank schon mal im Voraus > Razeradio^^ Hallo, unter der Annahme, dass die eigentliche Formel 82*(a^8-a^4)/(b*c*d) heisst, ist ein Ergebnis a=2, b=12, c=20 und d=41. Die Abfrage nach einem ganzzahligen Ergebnis kann man auch damit erreichen, indem man den Teil vor dem Bruchstrich rechnet (X als ganze Zahl) und den Teil nach dem Bruchstrich (Y). In C (und somit auch C++) gibt es den Modulo-Operator %. Falls nun X%Y == 0 ist, ist die Ganzzahligkeit der Loesung gegeben. Gruss Matthias
Mein Tip: einige Zeit scheitern, und dann entweder aufgeben oder das hier benutzen: https://gmplib.org/
Klaus W. schrieb: > https://gmplib.org/ Es gibt etwa 3 Milliarden Lösungen (Permutationen von b, c und d nicht mitgezählt), an die man mit gewöhnlicher 64-Bit-Arithmetik herankommt.
OT: Spannend, wie hier einige gleich los rechnen... :-) Wer's etwas interessanter mag: http://www.heise.de/ct/ausgabe/2015-18-Knobelaufgabe-Der-c-t-NerdCube-2769034.html /OT
Das ganze soll ja wohl nur mit Integer-Arithmetik möglichst effizient gelöst werden. Man zerlegt also 82*(a^8-a^4) in Primfaktoren. b, c, d sind dann alle möglichen Produkte aus Primfaktoren, die lt. Aufgabe größer 10 sind. Die Primfaktoren dürfen aus der gefundenen Liste natürlich nur in jeweils einem Produkt verwendet werden. Zur Frage: Abbruch in einer while Schleife kann mit modulo (%) gemacht werden: while( 82*(a^8-a^4) % b*c*d ) {...}
Razeradio schrieb: > der so lange mithilfe einer While-Schleife die Variablen der Gleichung > erhöht Wer sagt, dass dieser Ansatz überhaupt richtig ist und zur Lösung führt? Will sagen: Gleichungen löst man auch auf dem Computer mittels mathematischer Methoden. "Alle Variablen schrittweise erhöhen" klingt mehr nach Gebastel als nach einem vernünftigen Ansatz ;-)
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.