首页 > 代码库 > 算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

本人菜鸟一枚,上午在看书的时候突然看到了求最大公约数的一个例题,突然就想到以前好像看过一个欧几里得算法,故又上网仔细找了一下欧几里得算法的原理。可能是本人时间长没看算法,脑子都生锈了。

看了几个讲解欧几里得算法的文章,大都只给公式,然后说了一大堆因为、、、、在我还没看懂的时候,突然来了个所以、、、然后公式就这样推出来的。⊙﹏⊙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