Fork me on GitHub

求最大公约数的相关算法


1.穷举法
从两数中较小的数开始往下遍历,依次判断,简单易懂,但耗费时间相对较长,一般不推荐。


int gcd(int n, int m)
{
    if (n<m)
    {
        n^=m;
        m^=n;
        n^=m;
    }
    for(int i=m;;i--)
    {
        if(n%i==0&&m%i==0)
            return i;
    }
}

 


2.欧几里得算法(辗转相除法)
两数相除求余数,将余数与两数中较小的一个相除求得余数,直至余数为0.

//辗转相除法的递归实现
int gcd(int n, int m)
{
    if (n<m)
    {
        n^=m;
        m^=n;
        n^=m;
    }
    if (m==0) return n;
    return gcd(m,n%m);
}

 



3.相减法
大数减小数,二者差值再与小数求差,直至二者相等。

int gcd(int n, int m)
{
    if(m==n)
        return m;
    while(n!=m)
    {
        if(n>m)
            n-=m;
        else
            m-=n;
    }
    return m;
}

 

另外,一般求最小公倍数可以用二者乘积除以它们的最大公约数。求多个数的最大公约数可用递归来实现:

int ngcd(int *p, int n)
{
    if(n==1)
        return *p;
    return (gcd(p[n-1],ngcd(p,n-1)));  
}   

 

posted @ 2017-03-14 17:46  Vicebery  阅读(148)  评论(0编辑  收藏  举报