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);
}