兩個數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); }