最大公约数的四种求法(暴力、短除法、辗转相除法递归和非递归)

第一种(暴力法)

思路:取a、b两个数,再取一个变量i,变量i的初始值为1,从1开始遍历到a和b中小的那个数,每一次i递增的时候都用a和b除以i,找到最后能够同时整除那个数,就是最大公约数。

代码

import java.util.Scanner;

/**
 * @Param a,b :求它们两个的最大公约数  gcd :最大公约数值
 * @Author 小李同学
 * @Date 2021/1/20 20:42
 * @return 无
 * @description 最大公约数:暴力解法
 */
public class test1 {
    public static void main(String[] args) {

        //第一种:暴力解决
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int gcd = 1;
        for (int i = 2; i <= (a > b ? b : a); i++) {
            if (a % i == 0 && b % i == 0) {
                gcd = i;
            }
        }
        System.out.println("最大公约数为:" + gcd);
    }
}

第二种(短除法)

思路:把a和b分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是最大公约数。

例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,12就是24和60的最大公约数。

代码

import java.util.Scanner;

/**
 * @Param a,b :求它们两个的最大公约数  gcd :最大公约数值
 * @Author 小李同学
 * @Date 2021/1/20 20:56
 * @return 无
 * @description 最大公约数:短除法
 */
public class test2 {
    public static void main(String[] args) {

        //第二种:短除法
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int gcd = 1;
        for (int i = 2; i <= (a > b ? b : a); i++) {
            while (a % i == 0 && b % i == 0) {
                gcd = gcd * i;
                a = a / i;
                b = b / i;
            }
        }
        System.out.println("最大公约数为:" + gcd);
    }
}

第三种(辗转相除法递归)

思路:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止,最后的除数就是这两个数的最大公约数。

代码

import java.util.Scanner;

/**
 * @Param a,b :求它们两个的最大公约数  gcd :最大公约数值
 * @Author 小李同学
 * @Date 2021/1/20 21:03
 * @return gcd(a,b) :int
 * @description 最大公约数:辗转相除法(递归)
 */
public class test3 {
    public static void main(String[] args) {

        //第三种:辗转相除法(递归)
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int gcd = gcd(a, b);
        System.out.println("最大公约数为:" + gcd);
    }

    public static int gcd(int a, int b) {
        if (b == 0) {
            return a;
        } else {
            int c = b;
            b = a % b;
            a = c;
            return gcd(a,b);
        }
    }
}

第四种(辗转相除法非递归)

代码

import java.util.Scanner;

/**
 * @Param a,b :求它们两个的最大公约数  gcd :最大公约数值
 * @Author 小李同学
 * @Date 2021/1/20 21:16
 * @return 无
 * @description 最大公约数:辗转相除法(非递归)
 */
public class test4 {
    public static void main(String[] args) {

        //第四种:辗转相除法(非递归)
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = 1;
        while (b != 0) {
            c = b;
            b = a % b;
            a = c;
        }
        System.out.println("最大公约数:" + a);
    }
}

版权声明:本文为weixin_43846904原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。