Bruchkürzung... Brauche dringend Hilfe!
-
MW_ICEMAN schrieb:
warum "kleinster"? ich suche ja den größten gemeinsamen teiler
Es ist wohl offensichtlich, dass CStoll ggt meint, und nicht 1.
-
OK, dann nimmst du halt den größten gemeinsamen Teiler

(auf jeden Fall gibt es da eine schnellere Methode zur Berechnung als deine Schleifenkonstruktion)
-
ja wie jetzt...?! die rechnung stimmt doch aber.... was soll daran falsch sein? erst wird geprüft welche zahl größer ist von beiden. im falle des nenners( was, ja meist so ist), wird geprüft ob der zähler durch den nenner zu teilen geht. ist das nicht der fall wird halt der zähler so lange - 1 gerechnet bis es geht. ist also richtig.
was den euklidischen algorithmus betrifft: hierzu müsste eine dritte zahl eingegeben werden und das soll aber nicht der fall ein, zudem müssten evtl. mehrere eingaben erfolgen
-
Du könntest auch mit demjenigen der heute morgen das Problem mit der Menüeingabe hatte den logischen Operator der Abbruchbedingung tauschen, dann passts bei Euch beiden

(Er hatte nen || wo ein && hingehörte, bei Dir umgekehrt).
-
echt jetzt?! || ist doch aber logisch ODER, oder etwa nich?

-
was den euklidischen algorithmus betrifft: hierzu müsste eine dritte zahl eingegeben werden und das soll aber nicht der fall ein, zudem müssten evtl. mehrere eingaben erfolgen
Wo hast du denn den (sorry) Käse gelernt? Der Euklidische Algorithmus berechnet den ggT von genau zwei Zahlen - da brauchst du keine zusätzlichen Eingaben.
-
MW_ICEMAN schrieb:
echt jetzt?! || ist doch aber logisch ODER, oder etwa nich?

Ja, und die Schleifenbedingung gibt an, wann die Schleife fortgesetzt werden soll - in deinem Fall wenn 'temp' ODER 'temp2' ungleich 0 sind.
-
Ja, || ist logisches Oder.
Du sagtest nur dass er die Schleife verlässt wenn temp2 == 2 ist (was er nicht soll). Wenn temp2 == 2 und temp == 0 verlässt er aber durchaus die Schleife (den Wert von temp hattest Du nicht erwähnt). Das würde sich durch Abwandeln der Bedingung ändern.
-
lol ich habs.... thx!!!!!!!!!
else
{
const int temp1 = zaehler;do
{zaehler=zaehler-1;
cout<<"zaehler "<<zaehler<<endl<<endl;
temp=nenner%zaehler;
cout<<"temp "<<temp<<endl<<endl;
temp2=temp1%zaehler;
cout<<"temp2 "<<temp2<<endl<<endl;}
while (temp2 !=0 || temp !=0);nenner=nenner/zaehler;
zaehler=zaehler/zaehler;zaehler=nenner-zaehler;
}
hat geklappt

-
Etwas ordenticher sähe das dann so aus:
void kurz (int &zaehler, int &nenner) { for(int i=0; i<min(zaehler, nenner) && abs(zaehler) > 1 && abs(nenner) > 1; ++i) { if(zaehler % i == 0 && nenner % i == 0) { zaehler /= i; nenner /= i; } }Aber wie schon erwähnt ist das nicht gerade effizient.
Jockel
-
Natürlich umgekehrt:
void kurz (int &zaehler, int &nenner) { for(int i=min(zaehler, nenner); i>1 && abs(zaehler) > 1 && abs(nenner) > 1; --i) { if(zaehler % i == 0 && nenner % i == 0) { zaehler /= i; nenner /= i; } }
-
ja klar,..... schon. aber wa ist, wenn beim ersten kürzen nicht komplett gekürzt wurde. Bsp: 'n bissl übertrieben: Wie kürzt man 68424/846026 ? Wahrscheinlich mit 2, aber es geht bestimmt auch anders... verstehst?

-
MW_ICEMAN schrieb:
ja klar,..... schon. aber wa ist, wenn beim ersten kürzen nicht komplett gekürzt wurde. Bsp: 'n bissl übertrieben: Wie kürzt man 68424/846026 ? Wahrscheinlich mit 2, aber es geht bestimmt auch anders... verstehst?

Klar kannst du jetzt anfangen, von 68424 an durchzutesten, bis du den ersten gemeinsamen Teiler gefunden hast, aber such dir vorher etwas, womit du die Wartezeit verbringen kannst
(oder schau dir den Euklid doch mal genauer an :D)