求多個數的最小公倍數

  小學的時候咱們就學過如何求兩個數的最小公倍數了,如求8,12的最小公倍數,用質數反覆除的方法, python

2| 8 24 app

2| 4 12 spa

2| 2  6 code

     1 3 rem

最後的結果就是2*2*2*3=24,可是如何求3個或3個數以上的最小公倍數呢?其實原理和求兩個數的最小公倍數是同樣的,下面是用Python實現的求多個數的最小公倍數的程序段,附上了比較詳細的註釋代碼,求各位的指教: get

import math
"""
    得到多個數的最小公倍數
    isPrime(n)
    getMutiPrime(n)
    getLeastCommonMutible(numList)
"""

def isPrime(n):
    """
    判斷一個數是不是質數
    """
    if n==2:
        return True
    if n==1 or n%2==0:
        return False
    p = int(math.sqrt(n))+1
    i = 3
    while i<p:
        if n%i==0:
            return False
        i+=2
    return True
        
def getMutiPrime(n):
    """get muti num of n
    n=num1*num2...*numx for num1...numx are all prime numbers
    將數n進行質因數分解 prime factorization
    """
    if n==2:
        resultlist = [2]
    else:
        list1 = [i for i in range(2,int(math.sqrt(n))+1) if isPrime(i)]
        #print(list1)
        resultlist=[]
        tmp = n
        while not isPrime(tmp) and tmp!=1:
            for i in list1:
                if tmp%i==0:
                    resultlist.append(i)
                    tmp=tmp//i
                    #print(tmp)
                    #print(resultlist)
        if tmp!=1:
            resultlist.append(tmp)
    return resultlist


def isMutillistFill(mutilLsit):
    """
    	判斷一個二維列表中的每個列表是否都爲空
    	mutilLsit=[[],[],[]] 返回False
    	mutilLsit=[[1],[],[]] 返回True
    """
    for row in mutilLsit:
        if len(row)>0:
            return True
    return False

def getLeastCommonMutible(numList):
    """
    numList 待求數的列表,
    返回它們的最小公倍數的質因數列表
    """
    primelists=[]
    set1=set({})
    mutilResult = []
    for i in numList:
        primelists.append(getMutiPrime(i))
        set1.update(set(i1 for i1 in getMutiPrime(i)))
    #print(primelists)
    flag = True
    flag1 = False
    while flag:
        for i in set1:
            for row in primelists:
                if i in row:
                    row.remove(i)
                    flag1 = True
            if flag1:
                mutilResult.append(i)
                flag1 = False
        flag = isMutillistFill(primelists)
    #print(mutilResult)        
    return mutilResult


def getMutil(numList):
    result = 1
    for i in numList:
        result*=i
    return result

if __name__=='__main__':
    print(getMutil(getLeastCommonMutible([8,12,20])))#獲取8,12,20的最小公倍數
    print(getMutil(getLeastCommonMutible([i for i in range(2,21)])))#獲取1到20的全部數的最小公倍數
相關文章
相關標籤/搜索