Python基於更相減損術實現求解最大公約數的方法

2022-10-04 03:54:08 字數 1934 閱讀 9730

先從網上摘錄一段演算法的描述如下:

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

《九章算術》是中國古代的數學專著,其中的「更相減損術」可以用來求兩個數的最大公約數,即「可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。」

翻譯成現代語言如下:

第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。

第二步:以較大的數減較小的數,接著把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。

看完上面的描述,我的第一反應是這個描述是不是有問題?從普適性來說的話,應該是有問題的。舉例來說,如果我求解4和4的最大公約數,可半者半之之後,結果肯定錯了!後面的演算法也不能夠進行!

不管怎麼說,先實現一下上面的演算法描述:

# -*- coding:utf-8 -*-

#! python2

def maxcommdivisor(m,n):

# even process

while 程式設計客棧m % 2 == 0 and n % 2 == 0:

m = m / 2

n = n / 2

# exchange order when needed

if m < n:

m,n = n,m

# calculate the max comm divisor

while m - n != n:

diff = m - n

if diff > n:

m = diff

else:

m = n

n = diff

return n

print(maxcommdivisor(55,120))

print(maxcommdivisor(55,77))

print(maxcommdivisor(32,64))

print(maxcommdivisor(16,128))

執行結果:

不用說,上面程式執行錯誤百出。那麼該如何更正呢?

首先,除的2最終都應該再算回去!這樣,程式修改如下:

def maxcommdivisor(m,n):

com_factor = 1

if m == n:

return n

else:

# process for even number

while m % 2 == 0 and n % 2 == 0:

m = int(m / 2)

n = int(n / 2)

com_ *= 2

if m < n:

m,n = n,m

diff = m - n

while n != diff:

m = diff

if m < n:

m,n = n,m

diff = m - n

return n * com_factor

print(maxcommdivisor(55,120))

print(maxcommdivisor(55,77))

print(maxcommdivisor(32,64))

print(maxcommdivisor(16,128))

通過修改,上面程式執行結果如下

雖說這段程式寫出來看著有點怪怪的,但是總體的演算法還是實現了。與輾轉相除等演算法相比,這個在迴圈的層級上有一定的概率會減小。特別是最後的兩組測試數字對ibcxfaial兒,這種情況下的效果要好一些。但是,總體上的演算法的效率,現在我還不能夠給個準確的衡量。

ps:這裡再為大家推薦幾款計算工具供大家進一步參考借鑑:

**一元函式(方程)求解計算工具:

科學計算器**使用_高階計算器**計算:

**計算器_標準計算器:

輾轉相除法與更相減損法

解釋輾轉相除法 它的定義是 用較小數除較大數,再用出現的餘數 第一餘數 去除除數,再用出現的餘數 第二餘數 去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。這裡有個基本原理 兩個數的最大公因數等於這兩個數相除的餘數中更 小的數的最大公...

c語言編寫 求最大公約數(使用更相減損術)

以較大的數減較小的數,接著把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。include int get common int a,int b 更像減損就是用大數減小數,再用減過後的數與之前較小數比較,再用大數減小數,直至兩數相等 else if a b else...

C語言 用更相減損術求最大公約數,最小公倍數

更相減損術 更相減損術是出自 九章算術 的一種求最大公約數的演算法,它原本是為約分而設計的,但它適用於任何需要求最大公約數的場合。出處 九章算術 用途 求最大公約數 作用 適用任何需要求最大公約數的場合 思想 九章算術 是中國古代的數學專著,其中的 更相減損術 可以用來求兩個數的最大公約數,原文是 ...