求最小公倍数的三种方法

求最小公倍数的三种方法

  • 方法(一) 较大数的倍数对较小数取余
  • 方法(二) 公式法 两个数的 乘积 等于他们的 最大公约数 * 最小公倍数
  • 方法(三) 分解质因数 不同的质因数出现几次乘几次,相同的质因数累乘出现最多的次数
    示例:
  • 12 的质因数 2
  • 26 的质因数 2 13
  • 最小公倍数 2 * 2 * 3 * 13
package com.wy;

/**
 * @author HelloWorld
 * @create 2021-04-06-9:36
 * @email 154803771@qq.com
 */
public class minMultiple {
    /**
     * 最小公倍数
     *  方法(一) 较大数的倍数对较小数取余
     *  方法(二) 公式法 两个数的 乘积 等于他们的  最大公约数 * 最小公倍数
     *  方法(三) 分解质因数 不同的质因数出现几次乘几次,相同的质因数累乘出现最多的次数
     *            eg  12 的质因数  2 2 3
     *                26 的质因数 2 13
     *                最小公倍数  2 * 2 * 3 * 13
     */
    public static void main(String[] args) {
        int x = 99;
        int y = 108;
        // 暴力
        System.out.println("暴力 " + normal(x, y));

        // 利用最大公约数求最小公倍数
        System.out.println("公式法 " + commonDivisorMultiple(x, y));

        // 分解质因数
        System.out.println("分解质因数 " + div(x, y));
    }

    public static int normal(int x, int y){
        int max = x > y ? x : y;
        int min = x < y ? x : y;
        int n = max;
        while(true) {
            if (max % min == 0) {
                return max;
            }
            max += n;
        }
    }

    /**
     *  a * b = 最大公约数 * 最小公倍数
     */
    public static int commonDivisorMultiple(int x, int y) {
        return x * y / divisionAndDivision(x, y);
    }

    // 辗转相除求最大公约数
    public static int divisionAndDivision (int x, int y) {
        int max = Math.max(x, y);
        int min = Math.min(x, y);
        // 取余
        x = max % min;
        if (x == 0) {
            return min;
        } else {
            // 对余数 和 被除数 辗转相除
            return divisionAndDivision(x, min);
        }
    }

    /**
     * 分解质因数
     * 常见质因数  2, 3, 5, 7, 11, 13, 17, 19, 23, 29
     */
    public static int div(int x, int y) {
        int[] array = new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
        int fact = 1;
        int i = 0;
        while (i < array.length) {
            int data = array[i];
            if (x % data == 0 || y % data == 0) {
                fact *= data;
                if (x % data == 0) {
                    x /= data;
                }
                if (y % data == 0) {
                    y /= data;
                }
                if (x == 0 && y == 1 || x == 1 && y == 1 || x == 0 && y ==0 || x == 1 && y == 0) {
                    break;
                }
            } else {
                i++;
            }
        }
        return fact;
    }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值