Python基于更相減損術(shù)實(shí)現(xiàn)求解最大公約數(shù)的方法
本文實(shí)例講述了Python基于更相減損術(shù)實(shí)現(xiàn)求解最大公約數(shù)的方法。分享給大家供大家參考,具體如下:
先從網(wǎng)上摘錄一段算法的描述如下:
更相減損法:也叫 更相減損術(shù),是出自《 九章算術(shù)》的一種求最大公約數(shù)的算法,它原本是為 約分而設(shè)計(jì)的,但它適用于任何需要求最大公約數(shù)的場合。
《九章算術(shù)》是中國古代的數(shù)學(xué)專著,其中的“更相減損術(shù)”可以用來求兩個(gè)數(shù)的最大公約數(shù),即“可半者半之,不可半者,副置分母、子之?dāng)?shù),以少減多,更相減損,求其等也。以等數(shù)約之?!?/span>
翻譯成現(xiàn)代語言如下:
第一步:任意給定兩個(gè)正整數(shù);判斷它們是否都是偶數(shù)。若是,則用2約簡;若不是則執(zhí)行第二步。
第二步:以較大的數(shù)減較小的數(shù),接著把所得的差與較小的數(shù)比較,并以大數(shù)減小數(shù)。繼續(xù)這個(gè)操作,直到所得的減數(shù)和差相等為止。
看完上面的描述,我的第一反應(yīng)是這個(gè)描述是不是有問題?從普適性來說的話,應(yīng)該是有問題的。舉例來說,如果我求解4和4的最大公約數(shù),可半者半之之后,結(jié)果肯定錯(cuò)了!后面的算法也不能夠進(jìn)行!
不管怎么說,先實(shí)現(xiàn)一下上面的算法描述:
# -*- 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))
運(yùn)行結(jié)果:

不用說,上面程序執(zhí)行錯(cuò)誤百出。那么該如何更正呢?
首先,除的2最終都應(yīng)該再算回去!這樣,程序修改如下:
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_factor *= 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))
通過修改,上面程序執(zhí)行結(jié)果如下

雖說這段程序?qū)懗鰜砜粗悬c(diǎn)怪怪的,但是總體的算法還是實(shí)現(xiàn)了。與輾轉(zhuǎn)相除等算法相比,這個(gè)在循環(huán)的層級上有一定的概率會減小。特別是最后的兩組測試數(shù)字對兒,這種情況下的效果要好一些。但是,總體上的算法的效率,現(xiàn)在我還不能夠給個(gè)準(zhǔn)確的衡量。
PS:這里再為大家推薦幾款計(jì)算工具供大家進(jìn)一步參考借鑒:
在線一元函數(shù)(方程)求解計(jì)算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科學(xué)計(jì)算器在線使用_高級計(jì)算器在線計(jì)算:
http://tools.jb51.net/jisuanqi/jsqkexue
在線計(jì)算器_標(biāo)準(zhǔn)計(jì)算器:
http://tools.jb51.net/jisuanqi/jsq
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
- Python基于遞歸算法求最小公倍數(shù)和最大公約數(shù)示例
- Python自定義函數(shù)實(shí)現(xiàn)求兩個(gè)數(shù)最大公約數(shù)、最小公倍數(shù)示例
- Python基于遞歸和非遞歸算法求兩個(gè)數(shù)最大公約數(shù)、最小公倍數(shù)示例
- Python實(shí)現(xiàn)的求解最大公約數(shù)算法示例
- Python基于輾轉(zhuǎn)相除法求解最大公約數(shù)的方法示例
- Python實(shí)現(xiàn)利用最大公約數(shù)求三個(gè)正整數(shù)的最小公倍數(shù)示例
- 使用Python求解最大公約數(shù)的實(shí)現(xiàn)方法
- Python實(shí)現(xiàn)求最大公約數(shù)及判斷素?cái)?shù)的方法
- python如何求解兩數(shù)的最大公約數(shù)
相關(guān)文章
python計(jì)算階乘和的方法(1!+2!+3!+...+n!)
今天小編就為大家分享一篇python計(jì)算階乘和的方法(1!+2!+3!+...+n!),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Python WordCloud 修改色調(diào)的實(shí)現(xiàn)方式
這篇文章主要介紹了Python WordCloud 修改色調(diào)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python實(shí)現(xiàn)讀取文本文件并轉(zhuǎn)換為pdf
這篇文章主要為大家詳細(xì)介紹了如何使用Python簡便快捷地完成TXT文件到PDF文檔的轉(zhuǎn)換,滿足多樣化的文檔處理需求,感興趣的小伙伴可以參考下2024-04-04
Python實(shí)現(xiàn)手機(jī)號自動判斷男女性別(實(shí)例解析)
這篇文章主要介紹了Python實(shí)現(xiàn)手機(jī)號自動判斷男女性別,本文性別判斷主要依靠airtest中的自動化測試實(shí)現(xiàn),通過實(shí)例代碼給大家講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Python中sorted()函數(shù)之排序的利器詳解
sorted()函數(shù)是Python中的內(nèi)置函數(shù),用于對可迭代對象進(jìn)行排序,下面這篇文章主要給大家介紹了關(guān)于Python中sorted()函數(shù)之排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
python 實(shí)現(xiàn)網(wǎng)易郵箱郵件閱讀和刪除的輔助小腳本
這篇文章主要介紹了python 如何實(shí)現(xiàn)網(wǎng)易郵箱郵件閱讀和刪除輔助的小腳本,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法
今天小編就為大家分享一篇Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

