本人菜鳥一枚,上午在看書的時候突然看到了求最大公約數的一個例題,突然就想到以前好像看過一個歐幾里得算法,故又上網仔細找了一下歐幾里得算法的原理。可能是本人時間長沒看算法,腦子都生銹了。
看了幾個講解歐幾里得算法的文章,大都只給公式,然后說了一大堆因為、、、、在我還沒看懂的時候,突然來了個所以、、、然后公式就這樣推出來的。⊙﹏⊙b汗!
經過我這令人捉急的小腦袋轉了半天,最后有了點眉目,所以拿出來和大家分享一下!
1.首先說一下:歐幾里得算法是求兩個數的最大公約數的,你可能會問:什么是最大公約數?
(⊙﹏⊙我在一開始看到這個問題的時候,我就突然腦子短路,竟然不知道最大公約數是什么了)
最大公約數:即能夠同時被兩個數整除的那個最大的數。例如:8是16和8的公約數,因為16%8和8%8都等於零嘛!但4也是啊!所以兩個數的公約數會有很多,但我們要找出那個最大的!
2.讓我們來使用算式分析一下,假設求x和y的最大公約數。
a).先假設x>y,x和y的最大公約數用f(x,y)表示
b).假設 x/y = a;
x%y = b;
所以:a*y + b = x
(這個應該能看出來,因為a為x除以y的整數部分,b為x除以y的余數部分,所以a*y + b = x)
將上面那個式子調換一下位置得到:b = x – a*y;
因為x和y都能夠被f(x,y)整除 -----因為f(x,y)是x和y的最大公約數嘛
所以 b 也能夠被f(x,y)整除 -----即x和y的最大公約數f(x,y),它也是b的約數,所以求x和y的最大公約數也就相當於求y和b的最大公約數。(你可能會問,為什么本來求x和y的最大公約數,最后轉了半天變成了求y的b的公約數了?因為 y < x嘛,而且x%y肯定也小於y,所以,這樣一來,我們就把求最大公約數的范圍縮小了啊)
所以、歐幾里得的公式也就是這么來的f(x,y) = f(y,x%y);
所以這個算法的實現也就是不停的迭代,直到找出了x%y等於0時,則停止迭代,那個時候最大公約數也就是y了(因為x%y都等於0了,所以x和y的最大公約數也就是y本身了)。
3.上面可能說得有點啰嗦了,大家莫怪,本人也是想講得更清楚嘛!下面直接附上代碼實現部分:
public static int gcd(int x, int y){
//防止輸入為0,導致程序出錯
if(x == 0 || y == 0){return 0;}
//添加一個判斷保證x > y
if(x < y){
int temp = x;
temp = y;
y = x;
}
//算法實現
if(x%y == 0){
return y;
}else
{
return gcd(y,x%y);
}
}
其實還有好多其它的優秀的算法,在這里就先不提了,畢竟歐幾里得算法就挺高效的。在有些公司,這道題還作為筆試題出現過呢,所以,即將畢業去找工作的未來程序員,還是應該好好看一下的!O(∩_∩)O哈哈~