Forum: PC-Programmierung c++ Rechnen bis Ganzzahl ausgegeben wird


von Razeradio (Gast)


Lesenswert?

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
von break; (Gast)


Lesenswert?

while (condition)  {

}

oder auch:

while (1)  {

   // rechne
    if ( condition)
       break;
}

Zeig mal, was Du bis jetzt hast.

von Rolf M. (rmagnus)


Lesenswert?

Wenn ich dich richtig verstanden habe, suchst du sowas:
1
if (irgendwas)
2
    break;

von Dussel (Gast)


Lesenswert?

Die Frage geht wohl eher in die Richtung
1
while(Ergebnis!=(int)Ergebnis)

von Programmierer (Gast)


Lesenswert?

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)

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

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
von Dussel (Gast)


Lesenswert?

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 ;-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 ;-)

von Matthias H. (mheininger)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Mein Tip: einige Zeit scheitern, und dann entweder aufgeben oder das 
hier benutzen:
https://gmplib.org/

von Razeradio (Gast)


Lesenswert?

mit ^ sollte eine Potenz dargestellt werden

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Mikro 7. (mikro77)


Lesenswert?

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

von MikeH (Gast)


Lesenswert?

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 ) {...}

von Mark B. (markbrandis)


Lesenswert?

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
Noch kein Account? Hier anmelden.