2012-06-24 70 views
75

a和b的最大公約數(GCD)是除了它們之外沒有餘數的最大公約數。找兩個數字的GCDPython中最大公約數的代碼

一種方法是歐幾里得的算法,這是基於這樣的觀察,如果r是餘數ab分,然後gcd(a, b) = gcd(b, r)。作爲基礎案例,我們可以使用gcd(a, 0) = a

編寫一個名爲gcd的函數,其參數爲ab並返回其最大公約數。

+0

@bluefeet:對於我自己的薰陶,這怎麼不是過於寬泛? – zondo

+2

@zondo這個問題看起來很特殊[當看這些指導方針時](http://meta.stackoverflow.com/a/261370/426671)。 – Taryn

+3

「編寫一個名爲gcd的函數,它接受參數a和b並返回其最大公約數。」 - 嘆息,另一個粘貼作業問題到Stack Overflow的案例 –

回答

236

這是in the standard library。從inspect模塊

>>> from fractions import gcd 
>>> gcd(20,8) 
4 

源代碼在Python 2.7:

>>> print inspect.getsource(gcd) 
def gcd(a, b): 
    """Calculate the Greatest Common Divisor of a and b. 

    Unless b==0, the result will have the same sign as b (so that when 
    b is divided by it, the result comes out positive). 
    """ 
    while b: 
     a, b = b, a%b 
    return a 

對於Python 3.5,gcdis in the math module; fractions已被棄用。此外,inspect.getsource不再返回任何方法的解釋性源代碼。

+3

它不會返回*「_largest_數字,這兩個數字除以無餘數」*例如'fractions.gcd(1,-1) '是'-1'但是'1> -1',即'1'除了'1'和'-1'都沒有餘數,並且大於'-1',參見http://bugs.python。 org/issue22477 – jfs

+1

@JFSebastian我不認爲這是一個問題......只要看看源代碼中的註釋:*「除非b == 0,結果將與b」*具有相同的符號,因此'gcd(1,-1)== -1'對我來說似乎完全合法。 –

+0

@MarcoBonelli:是的。它的行爲如同文件記載,但它不是大多數人熟悉的教科書定義。 [閱讀我上面鏈接的討論](http://bugs.python.org/issue22477)。就個人而言,我喜歡像'fractions.gcd()'那樣(它對歐幾里德環元素起作用)。 – jfs

-1

此代碼計算取決於由#給用戶選擇兩個以上數量的GCD,在這裏用戶給出數

numbers = []; 
count = input ("HOW MANY NUMBERS YOU WANT TO CALCULATE GCD?\n") 
for i in range(0, count): 
    number = input("ENTER THE NUMBER : \n") 
    numbers.append(number) 
numbers_sorted = sorted(numbers) 
print 'NUMBERS SORTED IN INCREASING ORDER\n',numbers_sorted 
gcd = numbers_sorted[0] 

for i in range(1, count): 
    divisor = gcd 
    dividend = numbers_sorted[i] 
    remainder = dividend % divisor 
    if remainder == 0 : 
    gcd = divisor 
    else : 
    while not remainder == 0 : 
     dividend_one = divisor 
     divisor_one = remainder 
     remainder = dividend_one % divisor_one 
     gcd = divisor_one 

print 'GCD OF ' ,count,'NUMBERS IS \n', gcd 
+5

歡迎來到Stack Overflow!你會考慮增加一些敘述來解釋爲什麼這段代碼有效嗎?是什麼使它成爲這個問題的答案?這對詢問問題的人以及任何其他人來說非常有幫助。 –

-1

的價值交換,並沒有爲我很好地工作。所以我剛剛成立數字鏡子般情況被在任何一個< B或A進入> B:

def gcd(a, b): 
    if a > b: 
     r = a % b 
     if r == 0: 
      return b 
     else: 
      return gcd(b, r) 
    if a < b: 
     r = b % a 
     if r == 0: 
      return a 
     else: 
      return gcd(a, r) 

print gcd(18, 2) 
+2

這甚至不是有效的Python語法。縮進很重要。 –

+1

什麼時候a = b?你應該有一個初始的IF條件來解決這個問題。 –

0
a=int(raw_input('1st no \n')) 
b=int(raw_input('2nd no \n')) 

def gcd(m,n): 
    z=abs(m-n) 
    if (m-n)==0: 
     return n 
    else: 
     return gcd(z,min(m,n)) 


print gcd(a,b) 

基於Euclid算法不同的方法。

2
def gcd(m,n): 
    return gcd(abs(m-n), min(m, n)) if (m-n) else n 
+3

當你想要比較平等時,千萬不要使用'is'。小整數緩存是CPython實現細節。 –

30

使用m-n的算法可以運行得非常長。

這一個執行好得多:

def gcd(x, y): 
    while y != 0: 
     (x, y) = (y, x % y) 
    return x 
+5

這也是標準庫中的一個。 – sayantankhan

+8

該算法如何工作?它的魔力。 – user1311069

+0

在循環的核心中,賦值可以寫爲x = y; y = x%y。循環運行,直到y達到0.這是做gcd計算的「好方法」。結果將在函數返回的x中。更多信息可以在這裏找到:http://en.wikipedia.org/wiki/Euclidean_algorithm – netom

0
def gcdRecur(a, b): 
    ''' 
    a, b: positive integers 

    returns: a positive integer, the greatest common divisor of a & b. 
    ''' 
    # Base case is when b = 0 
    if b == 0: 
     return a 

    # Recursive case 
    return gcdRecur(b, a % b) 
-1

在Python遞歸:

def gcd(a, b): 
    if a%b == 0: 
     return b 
    return gcd(b, a%b) 
0
def gcd(a,b): 
    if b > a: 
     return gcd(b,a) 
    r = a%b 
    if r == 0: 
     return b 
    return gcd(r,b) 
0

對於a>b

def gcd(a, b): 

    if(a<b): 
     a,b=b,a 

    while(b!=0): 
     r,b=b,a%r 
     a=r 
    return a 

對於任何a>ba<b

def gcd(a, b): 

    t = min(a, b) 

    # Keep looping until t divides both a & b evenly 
    while a % t != 0 or b % t != 0: 
     t -= 1 

    return t 
+4

python中的交換變量是兒童遊戲:'b,a = a,b'。嘗試閱讀更多關於語言 – HuStmpHrrr

+2

我喜歡你說的話,但我不喜歡你說的方式 – JackyZhu

14

這個版本的代碼利用Euclid算法尋找GCD。

def gcdIter(a, b): 
    if b == 0: 
     return a 
    else: 
     return gcdIter(b, a % b) 
+25

你在名字中使用了* iter *,但它實際上是一個遞歸的版本。 –

+0

遞歸與循環版本相比效率較低,+您需要使用b> a –

+0

'def gcd(a,b)調用它:if b == 0:return a gcd(b,a%b)' – Andyk

-2
#This program will find the hcf of a given list of numbers. 

A = [65, 20, 100, 85, 125]  #creates and initializes the list of numbers 

def greatest_common_divisor(_A): 
    iterator = 1 
    factor = 1 
    a_length = len(_A) 
    smallest = 99999 

#get the smallest number 
for number in _A: #iterate through array 
    if number < smallest: #if current not the smallest number 
    smallest = number #set to highest 

while iterator <= smallest: #iterate from 1 ... smallest number 
for index in range(0, a_length): #loop through array 
    if _A[index] % iterator != 0: #if the element is not equally divisible by 0 
    break #stop and go to next element 
    if index == (a_length - 1): #if we reach the last element of array 
    factor = iterator #it means that all of them are divisibe by 0 
iterator += 1 #let's increment to check if array divisible by next iterator 
#print the factor 
print factor 

print "The highest common factor of: ", 
for element in A: 
    print element, 
print " is: ", 

greatest_common_devisor(A)

0

我覺得另一種方法是使用遞歸。這裏是我的代碼:

def gcd(a, b): 
    if a > b: 
     c = a - b 
     gcd(b, c) 
    elif a < b: 
     c = b - a 
     gcd(a, c) 
    else: 
     return a 
10
gcd = lambda m,n: m if not n else gcd(n,m%n) 
+0

哇!你真的打擊我了! (離開!)這應該是被接受的答案。沒有依賴關係,簡單的在線,出色的工作。謝啦。 –