Seite 1 von 2
Funktion größten gemeinsamen Teiler
Verfasst: Di Okt 30, 2012 11:21 pm
von hardcoding
Hallo allerseits,
Ich versuche gerade eine Funktion zuschreiben, die den größten gemeinsamen Teiler ausrechnet.
So sieht der folgende Code aus der Funktion aus.
i
Code: Alles auswählen
nt ggt(int wert1,int wert2)
{
int restwert;
if (wert1 > wert2)
{
do
{
restwert = wert1%wert2;
wert1 = wert2;
wert2 = restwert;
}
while(restwert == 0);
cout << restwert << endl;
}
else
{
do
{
restwert = wert2%wert1;
wert2 = wert1;
wert1 = restwert;
}
while(restwert == 0);
}
}
Wenn ich es kompliere,errechnet er mir nur den ersten Restwert. Ich will , dass er aber den Restwert so lange ausrechnet bis der Restwert 0 ist. Es soll mit anderen Worten die Bedingung erfüllt werden.
Nun weiß ich nicht warum er die weiteren Restwerte nicht ausrechnet bis die Bedingung erfüllt ist.
Bitte um eure Hilfe und danke im voraus
Re: Funktion größten gemeinsamen Teiler
Verfasst: Di Okt 30, 2012 11:24 pm
von Xin
Fang mal an, den Quelltext sauber einzurücken. Ich bin nicht sicher, ob ich die Frage richtig verstehe, aber ich vermute, dass wenn Du den Code sauber einrückst, Du den von mir vermuteten Fehler selbst findest.
Re: Funktion größten gemeinsamen Teiler
Verfasst: Di Okt 30, 2012 11:30 pm
von hardcoding

Ich hoffe ,dass es jetzt sauber eingerückt ist.
Re: Funktion größten gemeinsamen Teiler
Verfasst: Di Okt 30, 2012 11:46 pm
von cloidnerux
Bis "restwert" also 0 sein soll, soso.

Re: Funktion größten gemeinsamen Teiler
Verfasst: Mi Okt 31, 2012 8:50 pm
von hardcoding
cloidnerux hat geschrieben:
Bis "restwert" also 0 sein soll, soso.

Das ist eigentlich richtig. wieso soso ?
Code: Alles auswählen
int ggt(int wert1,int wert2)
{
int restwert;
if (wert1 > wert2)
{
do
{
restwert = wert1%wert2;
wert1 = wert2;
wert2 = restwert;
}
while(restwert == 0);
cout << "größter gemeinsamer Teiler"<< " "<< wert2<< endl;
}
else
{
do
{
restwert = wert2%wert1;
wert2 = wert1;
wert1 = restwert;
}
while(restwert == 0);
cout << "größter gemeinsamer Teiler" << wert1 << endl;
}
}
Wenn restwert gleich null ist,zeigt er den wert2 also den grössten gemeinsamen teiler nach den Euklidischer Algorithmus. Das Problem liegt dabei ,dass er den nächsten Restwert nicht weiter rechnet. Wenn ich es mit den wert1 = 1071 und wert2 =1029 kompliere zeigt er als Restwert in der Konsole 42 und das ist der erste Restwert und nicht der Restwert == 0.
Re: Funktion größten gemeinsamen Teiler
Verfasst: Mi Okt 31, 2012 8:56 pm
von cloidnerux
Das ist eigentlich richtig. wieso soso ?
"while" ist Englisch und lässt sich ungefähr mit "Solange" übersetzten. Damit wird also die Schleife nur solange ausgeführt, wie die Bedingung Wahr ist.
Wenn nun also "restwert == 0" wahr sein soll, wenn du FERTIG bist mit berechnen, dann ist es doch logisch falsch dies als Bedingung für das weiterführen der Berechnung zu nutzen.
Wenn restwert gleich null ist,zeigt er den wert2 also den grössten gemeinsamen teiler nach den Euklidischer Algorithmus
Hier solltest du deinen Gedankenfehler also merken, die Bedingung ist nicht zum beenden der Schleife, sondern zum weiterführen.
Re: Funktion größten gemeinsamen Teiler
Verfasst: Mi Okt 31, 2012 9:21 pm
von hardcoding
cloidnerux hat geschrieben:Das ist eigentlich richtig. wieso soso ?
"while" ist Englisch und lässt sich ungefähr mit "Solange" übersetzten. Damit wird also die Schleife nur solange ausgeführt, wie die Bedingung Wahr ist.
Wenn nun also "restwert == 0" wahr sein soll, wenn du FERTIG bist mit berechnen, dann ist es doch logisch falsch dies als Bedingung für das weiterführen der Berechnung zu nutzen.
Wenn restwert gleich null ist,zeigt er den wert2 also den grössten gemeinsamen teiler nach den Euklidischer Algorithmus
Hier solltest du deinen Gedankenfehler also merken, die Bedingung ist nicht zum beenden der Schleife, sondern zum weiterführen.
Ich danke dir. Ich habe do while schleife andersherum verstanden. Ich habe nochmal in meinen Buch nachgeguckt und da das Problem löst sich.
Ich musste noch eine weitere Variable hinzufügen damit das richtige Ergebnis rauskommt.
so sieht es jetzt aus.
Code: Alles auswählen
int ggt(int wert1,int wert2)
{
int restwert,wert3;
if (wert1 > wert2)
{
do
{
restwert = wert1%wert2;
wert1 = wert2;
wert3 = wert2;
wert2 = restwert;
}
while(restwert != 0);
cout << "größter gemeinsamer Teiler"<< " "<< wert3<< endl;
}
else
{
do
{
restwert = wert2%wert1;
wert2 = wert1;
wert3 = wert1;
wert1 = restwert;
}
while(restwert != 0);
cout << "größter gemeinsamer Teiler" << wert1 << endl;
}
}
Re: Funktion größten gemeinsamen Teiler
Verfasst: Mi Okt 31, 2012 9:29 pm
von cloidnerux
Ich danke dir. Ich habe do while schleife andersherum verstanden. Ich habe nochmal in meinen Buch nachgeguckt und da das Problem löst sich.
Wusste ich doch^^
Ich musste noch eine weitere Variable hinzufügen damit das richtige Ergebnis rauskommt.
Wozu die zusätzliche Variable?
Dein Problem war doch, dass du in Wert2 den restwert gespeichert hast und damit 0.
Du willst aber den alten Wert haben, den du in wert1 speicherst. Wieso nimmst du nicht einfach direkt wert1?
Re: Funktion größten gemeinsamen Teiler
Verfasst: Mi Okt 31, 2012 9:32 pm
von hardcoding
Wozu die zusätzliche Variable?
Dein Problem war doch, dass du in Wert2 den restwert gespeichert hast und damit 0.
Du willst aber den alten Wert haben, den du in wert1 speicherst. Wieso nimmst du nicht einfach direkt wert1?
Oh man manchmal denke ich zu umständlich. Naja egal was solls.

Re: Funktion größten gemeinsamen Teiler
Verfasst: Mi Okt 31, 2012 9:57 pm
von cloidnerux
Oh man manchmal denke ich zu umständlich. Naja egal was solls.
Macht nichts, manchmal möchte man den Wald vor lauter Bäumen nicht sehen. Das kommt aber mit der Zeit^^
Und es hat schon eine gewisse Bedeutung, effizient zu programmieren: man spart Ressourcen und Zeit, was sich vor allem bei großen Algorithmen oder langen Berechnungen hilft.