求最小公倍数的两种算法(Java实现)

求最小公倍数的两种算法(Java实现)

  • 求两个正整数的最小公倍数是很常见的运算。比如,3和5的最小公倍是15。6和8的最小公倍数是24。
    下面的算法为给定的两个正整数求它的最小公倍数。

1.由最大公约数求最小公倍数

又称公式法,两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即可以利用辗转相除法(欧几里得算法)或者辗转相减(更相减损术)或者分解质因数法先求出最大公约数再用两数之积除以最大公约数得出最小公倍数。下面分析一下求最大公约数的三种算法。

(1)首先先复习一下什么是辗转相除法
辗转相除
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法(辗转相除法),是这样进行的:
1997 / 615 = 3 (余152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1,以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数。

import java.util.Scanner;

public class 最小公倍数 {
    
    

   public static int 辗转相除法(int a, int b) {
    
    
           if (a % b == 0)
               return b;
           else {
    
    
               return 辗转相除法(b, (a % b));
           }
    }


    public static void main(String[] args){
    
    
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入第一个数字");
        int a=scanner.nextInt();
        System.out.println("请输入第二个数字");
        int b=scanner.nextInt();
        if(a<b) {
    
    //a,b需要先判断大小并排序
            int c = a;
            a = b;
            b = c;
        }

       System.out.println("两数的最小公倍数为"+a*b/辗转相除法(a,b));


    }
}

(2)辗转相减法的简单复习
辗转相减

  • 若a>b,则a=a-b
  • 若a=b,则a(或b)即为两数的最大公约数
  • 若a≠b,则再回去执行第一步

如求35和14两个正整数的最大公约数,用更相减损术(辗转相减法),是这样进行的:
35-14=21
21-14=7,此时,7小于14,要做一次交换,把14作为被减数
即14-7=7
7-7=0 这样也就求出了最大公约数7

其特色是做一系列减法,用大数减去小数,从而求得最大公约数。

import java.util.Scanner;

public class 最小公倍数 {
    
    

    public static int 更相减损术(int a,int b){
    
    
        if(a<b) {
    
    
            int c = a;
            a = b;
            b = c;
        }
        if (a == b) {
    
    
            return a;
        }
        else {
    
    
            return 更相减损术(a-b, b);
        }
    }


    public static void main(String[] args){
    
    
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入第一个数字");
        int a=scanner.nextInt();
        System.out.println("请输入第二个数字");
        int b=scanner.nextInt();
        System.out.println("两数的最小公倍数为"+a*b/更相减损术(a,b));


    }
}

(3)分解质因数
简单复习:
假设我们求24和60的最大公约数。
第一步:分解24和60。
24=2X2X2X3
60=2X3X2X5
第二步:24和60的最大公约数等于24和60共有的公因子相乘,即2X2X3=12。

即应把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。

import java.util.ArrayList;
import java.util.Scanner;

public class 分解质因子 {
    
    
    public  int f(int a,int b) {
    
    
        //创建两个整数泛型数组
        ArrayList<Integer> arrayList1 = new ArrayList<Integer>();
        ArrayList<Integer> arrayList2 = new ArrayList<Integer>();
        //分解第一个正整数质因子并放入数组1
        for (int i = 2; a > 1; i++) {
    
    
            for (; (a % i) == 0; a /= i) {
    
    
                arrayList1.add(i);
            }
        }
        //分解第二个正整数质因子并放入数组2
        for (int j = 2; b > 1; j++) {
    
    
            for (; (b % j) == 0; b /= j) {
    
    
                arrayList2.add(j);
            }
        }
        int button = 0;
        int 最大公约数 = 1;
        int temp = 0;
        //查找相同质因子,找到相同因子存储后,删除两个数组中的相同因子
            while (button < arrayList1.size()) {
    
    //数组访问从第零个开始
                if (arrayList2.contains(arrayList1.get(button))) {
    
    //查找相同元素
                    最大公约数 = arrayList1.get(button) * 最大公约数;
                    arrayList2.remove(arrayList2.indexOf(arrayList1.get(button)));
                    arrayList1.remove(button);
                    button = temp;//每次删除完元素从temp开始查找
                } else {
    
    temp = button += 1;//如果没相同元素temp+1
            }
            }
           return 最大公约数;

    }



    public static void main(String[] args) {
    
    
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入第一个正整数");
        int a=scanner.nextInt();
         System.out.println("请输入第二个正整数");
         int b=scanner.nextInt();
        分解质因子 A=new 分解质因子();
        int c=A.f(a,b);
         System.out.println("最小公倍数为"+a*b/c);
    }
}

2.累加法

又称穷举法(改进版)。设正整数a,b。他们的最小公倍数一定是a,b的倍数,所以任选a,b一个作为循环变量初始值(假设选a),若变量值除以b能除尽,则此时的变量值就是他们的最小公倍数,否则变量依次+a。

import java.util.Scanner;

public class 最小公倍数 {
    
    
    public static int f(int a, int b)
    {
    
    
        int i;
        for(i=a;;i+=a){
    
     
            if(i%b==0) return i;
        }
    }
    public static void main(String[] args){
    
    
         Scanner scanner=new Scanner(System.in);
        System.out.println("请输入第一个数字");
        int a=scanner.nextInt();
        System.out.println("请输入第二个数字");
        int b=scanner.nextInt();//此函数中a,b无需比较大小。
        System.out.println(f(a,b));
    }
}  

新手上路,因能力有限,若有不足之处还望大家海涵!

猜你喜欢

转载自blog.csdn.net/weixin_46569912/article/details/113195340