给定两个数求最大公约数,最小公倍数【Java】

本篇文章展示语言为Java,主要运用暴力枚举和辗转相除法。

一、求最大公约数

1.暴力枚举法

主要思路:先找出两个数当中的最小值赋值给min,判断min是否可以被这两个数整除,如果条件失败就减减,直到找到为止。

public class demo2 {
    //给定两个数,求这两个数的最大公约数
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        //找出两个数的最小值
        int min = (a > b ? b : a);
        while (true){
            if (a % min == 0 && b % min == 0 ) {
                break;
            }
            min--;
        }
        System.out.println(min);
    }
}

2、辗转相除法

其实也很简单,没有那么玄乎,但是没有特意学过的人并不容易想出来,大致思路如下:

将输入的两个数一个赋值给a,一个赋值给b,然后将a%b的结果赋值给另一个变量m。

之后呢,如果m不为0,就将b赋值给a,m赋值给b,再次计算m的值。

直到m为0,当m为0时,这时的b就为两者之间的最大公约数。

public class demo2 {
    //给定两个数,求这两个数的最大公约数
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int m = a % b;
        while (m != 0 ) {
             a = b;
             b = m;
             m = a % b;
        }
        System.out.println(b);
    }
}

值得提醒的是:这里是没必要像暴力枚举那般,将a固定为大的值,b为小的值,其实你细心想想,这并不影响,举个栗子,a为18,b为24,当a%b时,m的结果为18,顺着程序的思路,m的赋值给b,b的值赋值给a....... 发现程序会自动帮我们校对。

二、求最小公倍数

1、暴力枚举法

同求最大公约数是一样的,通过暴力枚举的方式,取a和b中的最大值,之后再看这个最大值是否能整除于这两个数,不能的话就让max继续自增,如此反复,直到max满足条件。

    public static void main(String[] args) {
        //求最小公倍数
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int max = a > b ? a : b;
        while(true) {
            if (max % a == 0 && max % b == 0) {
                break;
            }
            max++;
        }
        System.out.println(max);
    }

2、巧用数学特性

主要思路:我们知道两个数的乘积除以他们的最大公约数等于最小公倍数。

因此可以先利用辗转相除法求出最大公约数后再进行计算。

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        //先将最初的a和b保存一份
        int x = a;
        int y = b;
        int m = a % b;5
        while (m != 0 ) {
             a = b;
             b = m;
             m = a % b;
        }
        //先利用辗转相除法求最大公约数
        System.out.println(x*y/b);
    }

你可能感兴趣的:(java,算法,数据结构)