求兩個數的最大公約數

附上:最小公倍數=輸入整數的乘積//最大公約數

  • 1.窮舉法
    思想:num1,num2的因數全部找到,期中相同的且最大的即爲兩數的最大公因數
    思想改進:直接從num1和num2中較小的數的值開始到1,一個個驗證

    ① i= a(或b)

    ② 若a,b能同時被i整除,則i即爲最大公約數,結束

    ③ i–,再回去執行②

def gcd(a,b):
    #把a,b其中一個爲0考慮進去
    if b == 0:
        return a
    elif a == 0:
        return b
    else:
        for i in range(min(a,b), 0, -1):
            if a % i ==0 and a % i==0:
                return i
print(gcd(1,2),gcd(22,44))
結果:1 22
  • 2.1輾轉相處遞歸寫法:
    看思路即可:以下3個思路都對,1,2都有bug,除數爲0,採取3
    遞歸主要注意退出條件
    總結:3就是核心gcd代碼,以後都用它即可。這是歐幾里得式,據說致命缺點只有在很大素數是纔會體現,那時用減法(stein算法)
#1
def gcd2(n1,n2):
    """greatest common divisor function """
    if(n1%n2 == 0):
        return n2
    return gcd(n2,n1%n2)
print(gcd2(44,33)) #44,0
結果:11
#2.
def commonDivisor1(num1,num2):
    if num1 < num2:
        temp = num1
        num1 = num2
        num2 = temp
         
    if  num1%num2 ==0:
        return num2
    else:
        num2 = num1%num2
        return commonDivisor1(num1,num2) #num1改成num2
print(commonDivisor1(44,33)) #44,0
結果:11
#3.寫了辣麼多,其實就搞明白這段即可
def gcd4(a, b):
    if b == 0:return a
    return gcd4(b, a % b)
print(gcd4(0,44))
結果:44
  • 3 Stein算法
    描述:歐幾里德算法是計算兩個數最大公約數的傳統算法,無論是理論,還是從效率上都是很好的。但是他有一個致命的缺陷,這個缺陷只有在很大的素數時纔會顯現出來。Stein算法由J.Stein 1961年提出,這個方法也是計算兩個數的最大公約數。和歐幾里德算法不同的是,Stein算法只有整數的移位和加減法,這對於程序設計者是一個福音。
    爲了說明Stein算法的正確性,首先必須注意到以下結論:
    gcd(a, a) = a, 也就是一個數和他自己的公約數是其自身。
    gcd(ka, kb) = k * gcd(a, b),也就是最大公約數運算和倍乘運算可以交換,特殊的,當k=2時,說明兩個偶數的最大公約數比如能被2整除。
def gcd_Stein(a, b):  
  if a < b:
    a, b = b, a
  if (0 == b):
    return a
  if a % 2 == 0 and b % 2 == 0:
    return 2 * gcd_Stein(a/2, b/2)
  if a % 2 == 0:
    return gcd_Stein(a / 2, b)
  if b % 2 == 0:
    return gcd_Stein(a, b / 2)
   
  return gcd_Stein((a + b) / 2, (a - b) / 2) 
print(gcd_Stein(44,0))
結果 44
發佈了27 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章