1. 程式人生 > >用Java實現最大公約數與最小公倍數

用Java實現最大公約數與最小公倍數

    使用輾轉相除法可以快速的實現求最大公約數,而最小公倍數可以通過最大公約數求出。那麼輾轉相除法的原理是什麼呢?
    輾轉相除法,又名歐幾里德演算法,是已知最古老的演算法,其可追溯至公元前300年前。設兩數為a、b(a>b),用gcd(a,b)表示a,b的最大公約數,r=a(mod b) 為a除以b的餘數,k為a除以b的商,即a÷b=k...r。輾轉相除法即是要證明gcd(a,b)=gcd(b,r)。
    證明如下:
    1.令c=gcd(a,b)=gcd(b,r),則設a=mc,b=nc,那麼r= a-kb = (m-kn)c,由此可知,c也是r的因數;
    2.因為c是a與b的最大公約數,所以m與n互質,若要證明c也是b與r的最大公約數,那麼n與(m-kn)也必須互質。
    3.用反證法證明n與(m-kn)互質。若n與(m-kn)存在最大公約數d,那麼n = xd,(m-kn) = yd(d > 1),則m = yd+kn = (y+kx)d。從而可以推出m與n存在因數,並不互質,與條件相矛盾。所以n與(m-kn)互質。
    4.得到c=gcd(b,r),從而gcd(a,b)=gcd(b,r)。
**根據輾轉相除法用Java實現最大公約數和最小公倍數:**
//最大公約數
public int max(int m, int n){
    if(m < n){   //保證m>n
        int temp = n;
        n = m;
        m = temp;
    }
    if(m%n == 0){
        return n;
    }
    return max(n,m%n);
}
//最小公倍數
public int min(int m, int n){
    return m*n/max(m,n);
}