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)的層級(jí)上有一定的概率會(huì)減小。特別是最后的兩組測試數(shù)字對兒,這種情況下的效果要好一些。但是,總體上的算法的效率,現(xiàn)在我還不能夠給個(gè)準(zhǔn)確的衡量。
PS:這里再為大家推薦幾款計(jì)算工具供大家進(jìn)一步參考借鑒:
在線一元函數(shù)(方程)求解計(jì)算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科學(xué)計(jì)算器在線使用_高級(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的staticmethod與classmethod實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了python的staticmethod與classmethod實(shí)現(xiàn)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Python基礎(chǔ)學(xué)習(xí)之模塊的安裝和卸載
其實(shí)現(xiàn)在還是有很多剛開始學(xué)習(xí)的小伙伴,會(huì)遇到模塊不會(huì)安裝的情況,或者一遇到報(bào)錯(cuò)就懵了,這樣就很耽誤我們的學(xué)習(xí)進(jìn)度。所以,今天我們就來了解一下Python幾種安裝模塊的方法吧2022-09-09
使用python?matplotlib畫折線圖實(shí)例代碼
Matplotlib是一個(gè)Python工具箱,用于科學(xué)計(jì)算的數(shù)據(jù)可視化,下面這篇文章主要給大家介紹了關(guān)于如何使用python?matplotlib畫折線圖的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Python操作Excel神器openpyxl使用教程(超詳細(xì)!)
openpyxl庫是一個(gè)很好處理xlsx的python庫,下面這篇文章主要給大家介紹了關(guān)于Python辦公自動(dòng)化openpyxl使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
python提取具有某種特定字符串的行數(shù)據(jù)方法
今天小編就為大家分享一篇python提取具有某種特定字符串的行數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法
今天小編就為大家分享一篇Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python pyautogui模塊實(shí)現(xiàn)鼠標(biāo)鍵盤自動(dòng)化方法詳解
這篇文章主要介紹了Python pyautogui 模塊實(shí)現(xiàn)鼠標(biāo)鍵盤自動(dòng)化方法詳解,需要的朋友可以參考下2020-02-02
Python+tkinter實(shí)現(xiàn)一個(gè)繪圖風(fēng)格控件
這篇文章主要為大家詳細(xì)介紹了Python如何利用tkinter實(shí)現(xiàn)一個(gè)簡單的繪圖風(fēng)格控件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2023-09-09

