最大公約數相關原理

2021-04-16 00:12:45 字數 1813 閱讀 7919

去年某個時候總結的東西,這次做省賽題目時候就有乙個「更相減損術」的題目,感覺這些細小的知識還是不能忽略,貼出來分享一下~

輾轉相除法

輾轉相除法,又稱歐幾里德(euclid)演算法,是歐幾里德在約西元前300年提出的.

用輾轉相除法求兩個數的最大公約數的步驟如下:

先用小的乙個數除大的乙個數,得第乙個餘數;

再用第乙個餘數除小的乙個數,得第二個餘數;

又用第二個餘數除第乙個餘數,得第三個餘數;

這樣逐次用後乙個數去除前乙個餘數,直到餘數是0為止。那麼,最後乙個除數就是所求的最大公約數(如果最後的除數是1,那麼原來的兩個數是互質數)。

輾轉相除法是求兩個數的最大公約數的方法。如果求幾個數的最大公約數,可以先求兩個數的最大公約數,再求這個最大公約數與第三個數的最大公約數。這樣依次下去,直到最後乙個數為止。最後所得的乙個最大公約數,就是所求的幾個數的最大公約數。

這個思想的一般數學公式可以表示為:

***(a,b)=***(b,a mod b)

注: 函式***(x,y)表示x和y的最大公約數,(greatest common diviser);運算x mod y表示x除y的餘數,在c語言中可以表示為x % y;

簡單地描述為:a,b地最大公約數,等於b與a除b的餘數的最大公約數

分享乙個很精煉的函式

int ***(int a,int b)

在收集資料的過程中,我還發現一些有意思的東西~~

最小公倍數

公式可以描述為:

lcm(a,b)****(a,b)=a*b

注:函式lcm(x,y)表示x,y的最小公倍數(least common multiply);函式***(x,y)表示x,y的最大公約數;

通過這個公式我們知道,要求a,b的最小公倍數,只需求出a,b的最大公約數,然後套用公式,即可求出最小公倍數

這個公式稍微想一下是很好理解的

更相減損術

我國早期也有求最大公約數的演算法,就是"更相減損術".在《九章算術》中有更相減損術的步驟:

可半者半之,不可半者副置分母`子之數,以少減多,更相減損,求其等也,以等數約之.

翻譯:1.任意給出兩個正整數;判斷它們是否都是偶數.若是,用2約簡;若不是,執行第二步.

2.以較大的數減去較小的數,接著把較小的數與所得的差比較,並以大數減小數.繼續這個操作,直到所得的數相等為止,則這個數(等數)就是所求的最大公約數.

我曾經看到過乙個練習題就是用更相減損術描述的,大意是這樣:

q博士在實驗室培養一批細菌.他發現他的細菌中有兩種相互制約的細菌a和b.於是他培養這兩種細菌,在試驗中他發現細菌a,b有如下規律:當ab細菌共存時,細菌a,b中數量少的那一方每天會吞噬掉數量多的一方的部分個體,吞噬的數量等於數量少一方的個體數量;這樣培養下去,直到a,b細菌數量相等時,便不再相互吞噬.

程式要求任意輸入兩個數a,b分別代表細菌a,b的數量;程式要求輸出ab細菌數量達到穩定後的總個數.

這個題實質上就是要求兩個數的最大公倍數,但是它用了更相減損術來描述,如果對更相減損術不了解的話第一思路只能模擬題目的描述;一旦我們看出是求最大公約數,我們便可以用輾轉相除法來求解,大大提高解題效率!

輾轉相除法和更相減損術在數學本質上是相同的,只是乙個用的減法描述,另乙個用的除法描述.顯然,輾轉相除法的逼近速率要快得多. 

最大公約數

1.執行最大公約數的常用演算法,並新增異常處理模組 如輸入非法等 在基礎程式的基礎上,可以考慮手動輸入所有數字或者利用隨機數產生數字,分別加入異常處理模組。注 隨機數的產生方法 srand 的作用是提供乙個種子。然後呼叫rand 其格式為int rand void 它會根據提供給srand 的種子值...

最大公約數

最大公因數 greatest common divisor 也稱最大公約數 最大公因子,指兩個或多個整數共有約數中最大的乙個。a,b的最大公約數記為 a,b 同樣的,a,b,c的最大公約數記為 a,b,c 多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法 短除法 輾轉...

最大公約數

求兩數的最大公約數 簡單嗎?簡單!用多種方法求,可以嗎?emmmmm.應該可以吧?相信絕大多數人都知道求最大公約數的如下 所示的這種方法 include includeint commondivisor int x,int y min return min int main 先判斷兩個數的大小,將較...