算法怎么就這么難?----使用歐幾里得算法求兩數的最大公約數


本人菜鳥一枚,上午在看書的時候突然看到了求最大公約數的一個例題,突然就想到以前好像看過一個歐幾里得算法,故又上網仔細找了一下歐幾里得算法的原理。可能是本人時間長沒看算法,腦子都生銹了。

看了幾個講解歐幾里得算法的文章,大都只給公式,然后說了一大堆因為、、、、在我還沒看懂的時候,突然來了個所以、、、然后公式就這樣推出來的。⊙﹏⊙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哈哈~

         20132281138800


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM