python實現求兩個數最大公約數和最小公倍數


最大公約數
方法(一)

最大公約數(最大公因數)就是幾個數公有的因數中最大的一個。
例:12與18 12的因數有1,12,2,6,3,4
18的因數有1,18,2,9,6,3
公有的因數有1,2,3,6, 所以6就是12與18的最大公約數.
而求最大公約數的方法可以總結為:

1)更相減損法:更相減損術, 出自於中國古代的《九章算術》,也是一種求最大公約數的算法。

①先判斷兩個數的大小,如果兩數相等,則這個數本身就 是就是它的最大公約數。
②如果不相等,則用大數減去小數,然后用這個較小數與它們相減的結果相比較,如果相等,則這個差就是它們的最大公約數,而如果不相等,則繼續執行②操作。

python代碼實現如下
def calMaxCommonDivisor(a,b):
"""
5-15.
最大公約數和最小公倍數。請計算兩個整型的最大公約數和最小公倍數。
:return:最大公約數和最小公倍數(用更相減損法求最大公約數)
"""
while(1):
if(a > b):
a = a-b
elif(a < b):
b = b -a
else:
return a
if __name__ == '__main__':
print(calMaxCommonDivisor(10,75))


方法(二)

第二種方法(用輾轉相除法求最大公約數):
輾轉相除法, 又名歐幾里得算法(Euclidean algorithm),目的是求出兩個正整數的最大公約數。它是已知最古老的算法, 其可追溯至公元前300年前。

這條算法基於一個定理:兩個正整數a和b(a>b),它們的最大公約數等於a除以b的余數c和b之間的最大公約數。比如10和25,25除以10商2余5,那么10和25的最大公約數,等同於10和5的最大公約數。

2)輾轉相除法解法分析: 
①當兩個數相等時,其中任意一個就是它們的最大公約數,因為它們的余數為0; 
②當兩個數不相等時,用較大數除以較小數,當余數不為0時,這時 
使較小數作為被除數,余數作為除數,繼續 ②的操作,直至余數為0,那么大的那個數為最大公約數;這兩個數相等時,其中任一數為最大公約數。

def maxCommonDivison(a,b):
"""
用輾轉相除法求最大公約數
:return:
"""
while(a*b != 0):
if(a > b):
a = a % b
elif(a < b):
b = b % a
else:
return a
return max(a,b)

if __name__ == '__main__':
print(maxCommonDivison(25,100))

方法(三)

第三種方法:使用遞歸(結合輾轉相除法和更相減損法的優勢以及移位運算)

眾所周知,移位運算的性能非常快。對於給定的正整數a和b,不難得到如下的結論。其中gcb(a,b)的意思是求a,b的最大公約數的函數

當a和b均為偶數,gcb(a,b) = 2*gcb(a/2, b/2) = 2*gcb(a>>1, b>>1)

當a為偶數,b為奇數,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)

當a為奇數,b為偶數,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)

當a和b均為奇數,利用更相減損術運算一次,gcb(a,b) = gcb(b, a-b), 此時a-b的結果必然是偶數,又可以繼續進行移位運算。

比如計算10和25的最大公約數的步驟如下:

(10,25)———(10>>1,25 )————-( 5,25)
(5,25 )———-(5,25-5 )————(5,20)
(利用更相減損法)
(5,20)———-(5,20>>1 )———– (5,10)
(5, 10)———-(5,10>>1 )———– (5,5)
(5,5)———–(5,5-5)———(5,0)——-5為最大公約數

def gcd(a,b):
"""
使用遞歸(結合輾轉相除法和更相減損法的優勢以及移位運算)求最大公約數 性能最好
:return:
"""
if (a == b):
return a
if (a == 0 | b == 0):
return a + b
if (a == 1 | b == 1):
return 1
if (a < b):
gcd(b, a)
else:
# 兩個數都是偶數
if((a &1) == 0 and (b &1) == 0 ) :
return gcd(a >> 1, b >> 1)<<1
# a為偶數 b為奇數
elif((a &1) == 0 and (b &1)== 1):
return gcd(a >>1,b)
# a為奇數,b為偶數
elif((a &1) == 1 and (b &1)== 0):
return gcd(a, b >>1)
else:
#兩個數都是奇數
return gcd(b, a-b)

第三種方法python實現有點問題,待解決后更新




最小公倍數:
def leastCommultiple(a,b):
"""
最小公倍數就是幾個數公有的倍數中最小的一個。
6的倍數有6,12,18,24,……
4和6 公倍數 12,18……, 所以4和6的最小公倍數是12 。
如果求a和b的最小公倍數,可以先求出它們的最大公約數,最小公倍數就是 a*b/最大公約數
:return:
"""
mcd = maxCommonDivison(a,b)
lcm = (a*b)/mcd
return lcm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM