最大公约数与最小公倍数:辗转相除法

我只是个头图

已知两个数x和y,求x和y的最大公约数

暴力循环求解:

    public static void gcd(int x, int y) {
        if (y > x) {//如果y>x,交换x与y
            int t = x;
            x = y;
            y = t;
        }
        for (int i = y; i > 0; i--) {
            if (x % i == 0 && y % i == 0) {
                System.out.println(i);
                break;
            }
        }
    }

辗转相除法求解:

    public static void gcd(int x, int y) {
        while(true) {
            if(y==0) {
                System.out.println(x);
                break;
            }
            int t=y;
            y=x%y;
            x=t;    
        }   
    }

辗转相除法递归求解:

    public static void gcd(int x, int y) {
        if (y == 0) {
            System.out.println(x);
            return;
        }
        gcd(y, x % y);
    }

理解辗转相除法:

最大公约数与最小公倍数:辗转相除法_第1张图片
理解最大公约数.png

最小公倍数:

【定理】:两个数的乘积等于这两个数的最大公约数与最小公倍数的积,即(a,b)×[a,b]=a×b,a,b的最大公约数记为(a,b),a,b的最小公倍数记为[a,b]。

所以[a,b]=a×b / (a,b)

两个数的最小公倍数求解:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int x = in.nextInt();
        int y = in.nextInt();
        System.out.println(lcm(x, y));
    }

    public static int lcm(int x, int y) {//求两个数的最小公倍数
        return (x*y)/gcd(x,y);  
    }

    public static int gcd(int x, int y) {
        if (y == 0) {
            return x;
        }
        return gcd(y, x % y);
    }
}

求多个数的最大公约数和最小公倍数:

public class Main {
    public static void main(String[] args) {
        int[] nums = { 27, 18, 9, 81 };
        System.out.println("最大公约数:" + gcdMore(nums, 3));
        System.out.println("最小公倍数:" + lcmMore(nums, 3));
    }

    public static int gcd(int x, int y) {
        if (y == 0) {
            return x;
        }
        return gcd(y, x % y);
    }

    public static int lcm(int x, int y) {// 求两个数的最小公倍数
        return (x * y) / gcd(x, y);

    }

    private static int gcdMore(int[] nums, int n) {// 求多个数的最大公约数
        if (n == 1)
            return nums[n - 1];
        return gcd(nums[n - 1], gcdMore(nums, n - 1));
    }

    private static int lcmMore(int[] nums, int n) {// 求多个数的最小公倍数
        if (n == 1)
            return nums[n - 1];
        return lcm(nums[n - 1], lcmMore(nums, n - 1));
    }
}

讲解:

  1. 求n个数的最大公约数:采用递归。与求两个数的最大公约数一样,先将前面n-1个数的最大公约数求出来,再与第n个数进行辗转相除;
  2. 求n个数的最小公倍数:采用递归。与求两个数的最小公倍数一样,先将前面n-1个数的最小公倍数a求出来,再求该a与第n个数的最小公倍数;

你可能感兴趣的:(最大公约数与最小公倍数:辗转相除法)