三種算法求解最大公約數和最小公倍數

1.窮舉法

窮舉法的基本思想是:根據題目的部分條件確定答案的大致範圍,並在此範圍內對所有可能的情況逐一驗證,直到全部情況驗證完畢。若某個情況驗證符合題目的全部條件,則爲本問題的一個解;若全部情況驗證後都不符合題目的全部條件,則本題無解。窮舉法也稱爲枚舉法。

窮舉法時最通用的,也是最傻瓜式的一種算法,通過循環遞增或者循環遞減的方法來遍歷所有合理範圍內的數,通過判斷是否滿足條件來結束程序,從而得到最大公約數

解題步驟:

  1. 通過鍵盤輸入兩個需要求解的數
  2. 比較兩數的大小,找出較小的數
  3. 採用循環遞減的方法從最小數開始遞減至1
  4. 判斷當兩數的取餘都等於0時跳出循環
  5. 當前數即爲最大的公約數

詳細代碼:

##窮舉法求兩數最大公約數
def getGreatdivisor(a,b):
    if a>b:#默認b較大得數,否則兩數交換位置
        a,b=b,a
    for each in range(a+1,0,-1):
        if (a%each==0)&(b%each==0):
            result=each
            break;
    print("最大公約數爲:",result)

a=int(input("first:"))
b=int(input("second:"))
getGreatdivisor(a,b)       

2.更相減損法

更相減損術是出自《九章算術》的一種求最大公約數的算法,它原本是爲約分而設計的,但它適用於任何需要求最大公約數的場合。原文是:

1

可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。

如果需要對分數進行約分,那麼)可以折半的話,就折半(也就是用2來約分)。如果不可以折半的話,那麼就比較分母和分子的大小,用大數減去小數,互相減來減去,一直到減數與差相等爲止,用這個相等的數字來約分。

解題步驟:

  1. 通過鍵盤輸入兩個需要求解的數a,b
  2. 比較兩數的大小,找出較小的數,默認a爲較小的數
  3. 較大數b減去較小數a,如果相減結果等於較小數a,算法終止,當前a或b即爲最大的公約數
  4. 若減結果不等於較小數a,則轉到第二步

詳細代碼:

##相減法求兩數最大公約數
def getGreatdivisor(a,b):
    if a>b:#默認b較大得數,否則兩數交換位置
        a,b=b,a
    if b-a==a:
        print("最大公約數爲",a)
    else:
        getGreatdivisor(b-a,a)
        
a=int(input("first:"))
b=int(input("second:"))
getGreatdivisor(a,b)

 

3.輾轉相除法

輾轉相除法, 又名歐幾里德算法(Euclidean algorithm),是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0爲止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。

解題步驟:

  1. 通過鍵盤輸入兩個需要求解的數a,b
  2. 比較兩數的大小,找出較小的數,默認a爲較小的數
  3. 較大數b取餘較小數a,如果取餘結果等於較小數a,算法終止,當前a或b即爲最大的公約數
  4. 若取餘結果不等於較小數a,則轉到第二步

詳細代碼;

##輾轉相除法求兩數最大公約數
def getGreatdivisor(a,b):
    if a>b:#默認b較大得數,否則兩數交換位置
        a,b=b,a
    if b%a==0:
        print("最大公約數爲",a)
    else:
        getGreatdivisor(b%a,b)
    
a=int(input("first:"))
b=int(input("second:"))
getGreatdivisor(a,b)

 

4.用窮舉法實現求任意個數的最大公約數和最小公倍數

基本思想:通過鍵盤輸入需要求解的數值個數,將數值存放在一個列表中,對列表中的數值進行排序(會用到sort()函數),若要求最大公約數則從列表中去出第一個元素作爲開始,若要求最小公倍數則從列表中去除最後一個元素作爲開始。最後採用窮舉法的思想求得解。

注:這其中的判斷結束條件和之前有所不同,需要設置一個標記來記錄是否列表中的所有元素都滿足取餘條件,沒窮舉一個數都需要遍歷列表判斷是否取餘結果等於零,滿足條件標記自增,否則跳出遍歷循環繼續試下一個數。當標記等於列表元素個數時結束程序,當前數即爲最大公約數或者最小公倍數

詳細代碼:

##求n個數得最大公約數和最小公倍數
import sys
def getLCM(list,n):
    list.sort()
    max=list[n-1]
    for each in range(max,10000,):
        result=each
        count=0
        for number in range(len(list)):
            if each%list[number]==0:
                count+=1;
            else:
                break
        if count==len(list):
            break          
    print("最小公倍數爲:",result)

    
def getGCD(list,n):
    list.sort()
    min=list[0]
    for each in range(min,0,-1):
        result=each
        count=0
        for number in range(len(list)):
            if list[number]%each==0:
                count+=1;
            else:
                break
        if count==len(list):
            break
    print("最大公約數爲:",result)

list=[]
n=int(input("輸入個數:"))
for i in range(n):
    list.append(int(input("輸入第%d個數"%(i+1))))
getLCM(list,n) 
getGCD(list,n)

最大公約數_百度百科 https://baike.baidu.com/item/最大公約數/869308?fr=aladdin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章