附上:最小公倍數=輸入整數的乘積//最大公約數
-
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