最大公约数与最小公倍数的实现方式

最大公约数的三种实现方式

方式一:列举法

  • 主要思路:
    设置一个变量i使i的初始值为两个数较小的那一个,判断这两个数能否被i整除,能整除则返回最大公约数i,不能整除i让i–,再次进行判断,最终如果i=1,则两个数互质,流程图如图一所示。

方式二:相减法

  • 主要思路:
    输入的两个数当num1与num2不相等时,如果num1> num2,则num1=num1-num2,否则num2=num2-num1,反复进行上述过程,直到num1=num2,此时如果num1=1,说明两个数互为质数,否则为两个数的最大公约数。流程图如图二所示。
    这里写图片描述

  • 代码实现

/**
     * 
    * @Title: getCommonDivisor1 
    * @Description: 列举法求最大公约数
    * @return int:返回最大公约数
    * @author Administrator
    * @date 2018年9月5日下午8:49:28
     */
    public static int getCommonDivisor1() {
        System.out.println("请输入两个数:");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        if( num1 > num2) {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }
        for(int i=num2;i>=1;i--) {
            if(num2%i==0&&num1%i==0) {
                return i;
            }
        }
        return 1;//返回1表示两数互质
    }
    /**
     * 
    * @Title: getCommonDivisor3 
    * @Description: 相减法求最大公约数 
    * @return int 返回最大公约数
    * @author Administrator
    * @date 2018年9月5日下午8:54:45
     */
    public static int getCommonDivisor3() {
        System.out.println("请输入两个数:");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        while(num2!=num1) {
            if(num1>num2) 
                num1=num1-num2;
            else if(num2>num1)
                num2 = num2-num1;
        }
        return num1;
    }
    /**
     * 
    * @Title: getCommonDivisor3 
    * @Description: 重载相减法求最大公约数方法 
    * @param num1 参数之一
    * @param num2 参数之二
    * @return int
    * @author Administrator
    * @date 2018年9月5日下午9:17:13
     */
    public static int getCommonDivisor3(int num1,int num2) {
        while(num2!=num1) {
            if(num1>num2) 
                num1=num1-num2;
            else if(num2>num1)
                num2 = num2-num1;
        }
        return num1;
    }

方式三:辗转相除法

  • 主要思路:
    用户输入的两个数num1,num2(num1 < num2)设置一个变量temp,temp=num2%num1,当temp>0时num2=num1,num1=temp,temp=num2%num1。最终得到的temp如果为1则说明两个数相互为质数,否则temp为二者的最大公约数,流程图如下图所示。
    这里写图片描述

  • 代码实现

/**
     * 
    * @Title: getCommonDivisor2 
    * @Description: 辗转相除法求最大公约数 
    * @return int 返回最大公约数
    * @author Administrator
    * @date 2018年9月5日下午8:53:32
     */
    public static int getCommonDivisor2() {
        System.out.println("请输入两个数:");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        if( num1 > num2) {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }
        int temp =num2%num1;
        while(temp>0) {
            num2=num1;
            num1=temp;
            temp=num2%num1;
        }
        return num1;
    }

求三个数的最大公约数与最小公倍数

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * 
 * @ClassName: MaxCommonDivisorOfThreeNum 
 * @Description: 求三个数的最大公约数和最小公倍数
 * @author: Administrator
 * @date: 2018年9月5日 下午8:55:31
 */
public class MaxCommonDivisorOfThreeNum{
    static Scanner sc = new Scanner(System.in); 
    /**
     * 
    * @Title: getCommonDivisorOfThreeNum 
    * @Description: 求三个数的最大公约数,第二个值为最小公倍数
    * @return int[] 第一个值代表最大公约数,第二个值为最小公倍数
    * @author Administrator
    * @date 2018年9月5日下午8:55:50
     */
    public static int[] getCommonDivisorOfThreeNum() {
        System.out.println("请输入三个数:");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        int num3 = sc.nextInt();
        int [] result=new int[2];// 第一个值代表最大公约数,第二个值为最小公倍数
        List<Integer> sortList = new ArrayList<Integer>();//使用集合方便对三个数进行排序
        sortList.add(num1);
        sortList.add(num2);
        sortList.add(num3);
        Collections.sort(sortList);//将三个参数进行排序
        int temp = MaxCommonDivisorOfTwoNum.getCommonDivisor3(num1, num2);//先求两个数的最大公约数
        result[0] = MaxCommonDivisorOfTwoNum.getCommonDivisor3(temp, num3);//求第三个数公共的最大公约数      
        for(int i=sortList.get(2);;i++) {//使用列举法求最小公倍数
            if(i%num1==0&&i%num2==0&&i%num3==0) {
                result[1]=i;
                break;
            }       
        }
         return result; //返回结果
    }

}

主类进行测试

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("1.列举法求两个数的最大公约数");
            System.out.println("2.辗转相除发求两个数的最大公约数");
            System.out.println("3.相减法求两个数的最大公约数");
            System.out.println("4.求三个数的最大公约数和最小公倍数");
            System.out.println("0:退出");
            System.out.println("请选择:");
            String op = sc.next();
            if (op.equals("0")) {
                System.out.println("再见!");
                break;
            }
            switch (op) {
            case "1"://测试列举法
                int res1 = MaxCommonDivisorOfTwoNum.getCommonDivisor1();
                System.out.println(res1 == 1 ? "互为质数" : "最大公约数为:" + res1);
                break;
            case "2"://测试辗转相除法
                int res2 = MaxCommonDivisorOfTwoNum.getCommonDivisor1();
                System.out.println(res2== 1 ? "互为质数" : "最大公约数为:" + res2);
                break;
            case "3"://测试相减法
                int res3 = MaxCommonDivisorOfTwoNum.getCommonDivisor1();
                System.out.println(res3 == 1 ? "互为质数" : "最大公约数为:" + res3);
                break;
            case "4"://测试三个数的最大公约数和最小公倍数res4数组的第一个为最大公约数情况,第二个数为最小公倍数
                int[] res4 = MaxCommonDivisorOfThreeNum.getCommonDivisorOfThreeNum();
                System.out.print(res4[0] == 1 ? "互为质数" : "最大公约数为:" + res4[0]);
                System.out.println( " 最小公倍数为:" + res4[1]);
                break;
            default:
                System.out.println("输入错误");
            }
        }
    }
}
展开阅读全文

没有更多推荐了,返回首页