最大公約數


兩個數x,y的最大公約數記為gcd(x,y)

兩個數x,y的最小公倍數記為lcm(x,y)

則有:gcd(x,y)*lcm(x,y)=x*y

求解最大公約數的方法:

1、輾轉相減法:(又稱更相減損術)

當求大數的最大公約數時,以較大的數減去減小的數,接着把所得的差與較小的數比較,再以大數減小數,重復這個步驟,直到兩個數相等為止,這個數就是最大公約數。

公式:gcd(x,y)=gcd(x-y,y)(x>=y)

2、快速gcd輾轉相減法的優化

(1)若x,y相等:gcd(x,y)=x

(2)若x為偶數,y為奇數:gcd(x,y)=gcd(x/2,y)

(3)若x為奇數,y為偶數:gcd(x,y)=gcd(x,y/2)

(4)若x,y都是偶數:gcd(x,y)=2*gcd(x/2,y/2)

(5)若x,y都是奇數:gcd(x,y)=gcd(x-y,y)(x>=y)

C++代碼實現:

typedef long long int ll;
ll gcd(ll x,ll y)
{
    if(x==y)
        return x;
    bool fgx=(x&1);
    bool fgy=(y&1);
    if(fgx&&fgy)
    {
        if(x>y)
        return gcd(x-y,y);
    else
        return gcd(y-x,x);
    }
    if(!fgx&&!fgy)
        return 2*gcd(x>>1,y>>1);
    if(!fgx&&fgy)
        return gcd(x>>1,y);
    if(fgx&&!fgy)
        return gcd(x,y>>1);
}

3、輾轉相除法(又稱歐幾里得算法)

公式:

gcd(x,y)=gcd(y,x%y)

gcd(x,0)=x

C++代碼實現:

typedef long long int ll;
ll gcd(ll x,ll y)
{
    if(y==0)
        return x;
    return gcd(y,x%y);
}
View Code


免責聲明!

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



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