Feedback

VB - Größter gemeinsamer Teiler

Veröffentlicht von am 3/23/2010
(2 Bewertungen)
Diese Funktion berechnet iterativ den größten gemeinsamen Teiler(ggT) zweier ganzen Zahlen a & b.

Verglichen mit einer rekursiven Methode, ist der iterative Weg um einiges schneller.
Function ggT(ByVal a As Integer, ByVal b As Integer) As Integer
    While b > 0
        ggT = a Mod b
        a = b
        b = ggT
    End While

    Return a
End Function

7 Kommentare zum Snippet

regalis schrieb am 3/24/2010:
Also irgendwie übersteigt der Ausdruck "a = b" mein Verständnis :D
regalis schrieb am 3/24/2010:
Ich hab diese C#-Methode gefunden....sieht sinnvoller aus:
public static long GetGCD(long Number1, long Number2)
{
long remainder = 0;
do
{
remainder = Number1 % Number2;
Number1 = Number2;
Number2 = remainder;
} while (remainder != 0);
return Number1;
}
Klemens Nanni schrieb am 3/24/2010:
Ein kleiner, aber wesentlicher Fehler in der While-Schleife wurde ausgemerzt.

regalis, deine Funktion greift auf eine weitere, nicht zwingend notwendige Variable zurück. Sie ist weder sinnvoller noch schneller, eher im Gegenteil.
regalis schrieb am 3/24/2010:
Ich verstehe deine Logik nicht...sobald du "a=b" machst ist der Wert in a futsch...
Oder übersehe ich da eine raffinierte Mechanik in deinem Algorithmus!?
Klemens Nanni schrieb am 3/24/2010:
Falls du glaubst, die Funktion überschreibt a bevor sie sie verwendet, hast du nur zur Hälfte Recht.
Zwar wird a = b gesetzt, jedoch rechnet der Computer intern mit Kopien der Variablen, der eigentliche Wert verändert sich nicht.
regalis schrieb am 3/25/2010:
Ich habe jetzt extra ein VB-Project erstellt um deine Aussage zu testen(weil ich noch nie mit VB gecoded habe und nicht sicher war ob du nicht doch recht hast).
Und stell dir vor was ich entdeckt hab....
a wird von b überschrieben und a mod b ergibt sofort 0
Somit ist der Rückgabewert IMMER b!
Klemens Nanni schrieb am 3/25/2010:
Oh,
meine schlecht gewählten Testzahlen haben diese Lücke gut versteckt. Ich danke dir, der Code wurde soeben ergänzt.
 

Logge dich ein, um hier zu kommentieren!