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^^
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:
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.
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
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.
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 ;-)