Największy wspólny dzielnik (GCD) a i b to największa liczba, która dzieli oba z nich bez reszty.
Jednym ze sposobów znalezienia GCD dwóch liczb jest algorytm Euklidesa, który opiera się na obserwacji, że jeśli r
jest to reszta, kiedy a
jest podzielona przez b
, to gcd(a, b) = gcd(b, r)
. Jako podstawę możemy użyć gcd(a, 0) = a
.
Napisz funkcję zwaną GCD, który wymaga parametrów a
a b
i zwraca ich największy wspólny dzielnik.
Odpowiedzi:
Znajduje się w standardowej bibliotece .
Kod źródłowy z
inspect
modułu w Pythonie 2.7:Od wersji Python 3.5
gcd
znajduje się wmath
module ; ten wfractions
jest przestarzały. Ponadtoinspect.getsource
nie zwraca już wyjaśniającego kodu źródłowego dla żadnej z metod.źródło
fractions.gcd(1, -1)
Jest,-1
ale1 > -1
tj.1
Dzieli oba1
i-1
bez reszty i jest większa niż-1
, patrz bugs.python.org/issue22477gcd(1, -1) == -1
wydaje mi się całkowicie uzasadniony.fractions.gcd()
to, co jest (działa na elementach pierścienia euklidesowego).math.gcd(1, -1)
powraca1
.Algorytmy z mn mogą działać bardzo długo.
Ten działa znacznie lepiej:
źródło
x
przed przypisaniem. Przypisałeśy
jakox
pierwszy , więc terazy
zostanie ustawiony na0
(jaky % y
zawsze 0).Ta wersja kodu wykorzystuje algorytm Euclid do znajdowania GCD.
źródło
def gcd(a, b): if b == 0: return a return gcd(b, a % b)
źródło
źródło
Bardzo zwięzłe rozwiązanie wykorzystujące rekurencję:
źródło
używając rekurencji ,
używanie while ,
za pomocą lambdy,
źródło
Inne podejście oparte na algorytmie Euclid.
źródło
źródło
Myślę, że innym sposobem jest użycie rekurencji. Oto mój kod:
źródło
gcd(10,5)
w Pythonie z rekurencją:
źródło
źródło
Dla
a>b
:Dla jednego
a>b
luba<b
:źródło
b, a = a, b
. spróbuj przeczytać więcej o językuMusiałem zrobić coś takiego dla zadania domowego przy użyciu pętli while. Nie jest to najbardziej efektywny sposób, ale jeśli nie chcesz używać funkcji, działa to:
źródło
źródło
Ten kod oblicza gcd więcej niż dwóch liczb w zależności od wyboru podanego przez # użytkownika, tutaj użytkownik podaje liczbę
źródło
Zamiana wartości nie działała dobrze dla mnie. Więc po prostu skonfigurowałem sytuację podobną do lustra dla liczb, które są wprowadzane w a <b LUB a> b:
źródło
great_common_devisor (A)
źródło
źródło
break
dąży to stwierdzenie.Oto rozwiązanie wdrażające koncepcję
Iteration
:źródło