之前總結過一次高德納taocp中的最大公約數求解,其實課後題中的演算法修改要求實現的是輾轉相除法求解最大公約數。
這個題目我最初的理解理解錯了,自然也沒有做出標準答案。現在按照標準答案的解答寫一下相應的**實現:
defmaxcommdivisor(m,n):
while m * n != 0:
m = m % n
if m == 0:
return n
else:
n = n % m
if n == 0:
return m
print(maxcommdivisor(55,120))
程式的執行結果:
grey@desktop-3t80npq:/mnt/e/01_workspace/11_演算法/01_taocp$ python max_com_divisor.py
交換一下兩個數字的位置,**如下:
defmaxcommdivisor(m,n):
while m * n != 0:
m = m % n
if m == 0:
return n
else:
n = n % m
if n == 0:
return m
print(maxcommdivisor(120,55))
程式的執行結果:
grey@desktop-3t80npq:/mnt/e/01_workspace/11_演算法/01_taocp$ python max_com_divisor.py
題目提示中提到了會降低效率,通過上面的**來看,效率的損失應該是在除法以及判斷上。在此,把之前演算法的**拿過來對比一下:
defcommdevisor(m,n):
r = m % n
while r != 0:
m = n
n = r
r = m % n
return n
print(commdevisor(120,25))
新演算法在迴圈中,多了乙個除法以及比較操作。其實,比較的效率還是不錯的,但是除法的運算會導致效率的降低。
求最大公約數 輾轉相除法
設求a和b的最大公約數c 則可看做邊長分別為a和b的矩形,可恰好被邊長為c的正方形無縫隙填滿 方法 不斷地用長邊除以短邊取餘數,直到長邊與短邊相等,即為所求正方形 給定平面上的兩個格點p1 x1,y1 p2 x2,y2 線段p1p2上,除p1和p2以外一共有幾個點。示例 p1 3,9 p2 7,1 ...
基於輾轉相除法求最大公約數
1 p 0,q 0 無最大公約數 2 p 0,q 0 最大公約數為q 3 p 0,q 0 最大公約數為p 4 p 0,q 0 最大公約數可通過輾轉相除取餘數轉化為 2 3 這樣的情況來求解 遞迴版,非遞迴用迴圈 public class euclid public static int euclid...
輾除法求最大公約數 輾轉相除求最大公約數原理
輾轉相除法 並不難,很多人都會寫。public static int f int a,int b return a 舉個例子,例如6,8按照 執行一遍。求最大公約數步驟兩個數的最大公約數是指能同時整除它們的最大正整數。設兩數為a b a b 求a和b最大公約數的步驟如下 1 用a除以b a b 得 ...