程式設計之美 2 7 最大公約數問題

2021-09-08 15:44:26 字數 652 閱讀 2916

1. 簡述

寫乙個程式,求兩個正整數的最大公約數。如果兩個正整數很大,有什麼簡單的方法嗎?

2. 思路

這個書上總結的很全了已經。

輾轉相除法,設f(x,y)表示x與y的最大公因子,如果x=y*k+z,z>0,那麼f(x,y)=f(y,z),如果x=y*k+z,z=0,那麼f(x,y)=y,即此時x可以整除y。比如f(6,4)=f(4,2)=2,f(24,18)=f(18,6)=6。

改進方法,當正整數很大的時候,大數除法比較消耗時間,這裡規避大數的除法運算。

每次調整x,y保證x>=y,然後分情況討論:

當y=0時,f(x,y)=x。即x就是上一步可以被整除的因子。

當x%2=0且y%2=0時,f(x,y)=2*f(x/2, y/2),即都是偶數。

當x%2=0且y%2!=0時,f(x,y)=f(x/2, y),即乙個奇數乙個偶數。

當x%2!=0且y%2=0時,f(x,y)=f(x, y/2),即乙個奇數乙個偶數。

當x%2!=0且y%2!=0,f(x,y)=f(x-y, y),即兩個奇數,用減法代替除法。

實際上用到的是大數之間的減法和大數與非大數的除法,規避了大數之間的除法。

3. **

省略了。

4. 參考

程式設計之美,2.7節,最大公約數。

程式設計之美 2 7 最大公約數問題

1.簡述 寫乙個程式,求兩個正整數的最大公約數。如果兩個正整數很大,有什麼簡單的方法嗎?2.思路 這個書上總結的很全了已經。輾轉相除法,設f x,y 表示x與y的最大公因子,如果x y k z,z 0,那麼f x,y f y,z 如果x y k z,z 0,那麼f x,y y,即此時x可以整除y。比...

程式設計之美2 7 最大公約數,最小公倍數

書中的題目是求兩個數的最大公約數,其實這個問題時當我們學習c語言的時候老師就講過的演算法,和教學中的求素數是乙個型別的問題。我們當時學的方法是 輾轉相除法 即利用公式 f x,y f y,x y 直到 x y 0,取x就是兩個數的最大公約數。但是書中說道,乘除運算太浪費時間了,所以,我們可以換一種方...

最大公約數問題

最大公約數是個很基本的問題。歐幾里德在他的著作裡面給出了很高效的解法,輾轉相除法。假設f x,y 表示x,y的最大公約數,取k x y,b x y,那麼x ky b,這個能說明什麼問題呢?如果乙個數能整除x和y,那麼這個數也必定能整除y和b,並且x和y的最大公約數和y和b的最大公約數是相同的。於是就...