c++ Rechnen bis Ganzzahl ausgegeben wird

Gast #4268193
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^^
Gast #4268254
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)
Persönliche Seite #4268258
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.
Gast #4268270
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 ;-)
Moderator #4268292
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 ;-)
#4268298
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
Gast #4268563
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 ) {...}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren