Skip to content

Latest commit

 

History

History
72 lines (60 loc) · 1.64 KB

最大公约数&最小公倍数.md

File metadata and controls

72 lines (60 loc) · 1.64 KB

最大公约数(greatest common divisor)

欧几里得算法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

gcd(a,b) = gcd(b,a mod b) 

证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数

假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等, 直接上代码

    //递归实现
    private static int gcd(int m, int n) {
        if (n == 0) return m;
        else return gcd(n, m % n);
    }
    
    //非递归实现
    public static int gcd(int m, int n) {
        if (m < n) {// 保证m>n,若m<n,则进行数据交换
            int temp = m;
            m = n;
            n = temp;
        }
        while (m % n != 0) {// 在余数不能为0时,进行循环
            int temp = m % n;
            m = n;
            n = temp;
        }
        return n;
    }

推广到多个数上求最大的公约数

    // 求多个数的最大公约数
    public static int gcdArr(int[] num, int n) { //n代表标志位,开始时值为数组长度
        if (n == 1)
            return num[n - 1];
        return gcd(num[n - 1], gcdArr(num, n - 1));//调用前面的求两个数的最大公约数
    }

最小公倍数(Least Common Multiple)

代码

    //求最小公倍数,
    private static int lcm(int a, int b){
        return a*b/gcd(a, b);//调用上面最大公约数的代码
    }
    

多个数的最小公倍数

    public static long lcm(long[] a){
        long value=a[0];
            for(int i=1;i<a.length;i++){
                value=lcm(value,a[i]);
            }
        return value;
    }