用Java 求两个正整数的最大公约数和最小公倍数

求两个正整数的最大公约数和最小公倍数


基本要求
1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:
1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。


设计思路:

基本要求部分:

两个正整数的最大公约数:

1.辗转相除法:

若有两整数m和n:
(1)比较两数大小,若m小于n,交换
(2) m%n得到余数r
(3)若r为0时,则n是两个数的最大公约数
(4)若r不为0时,则m=n,n=r,再执行(1),继续循环

算法流程图:
这里写图片描述

2.穷举法
(1)先判断m,n两数的大小,得出最小数min
(2)将min赋给i
(3)用两个数分别对这个数i取余,若有余数,则i-1,再取余,若仍有余数再i-1,继续循环,直到当余数都为零时,则最大公约数为i

算法流程图:
这里写图片描述

3.相减法
(1)比较m和n的大小,若m>n,m=m-n,若n>m,n=n-m
(2)继续循环(1),直到m=n,退出循环
(3)最大公约数为m

算法流程图:
这里写图片描述

两个正整数的最小公倍数:最小公倍数=两个数的乘积/最大公约数


提高要求部分:

三个正整数的最大公约数:

(1)先判断m,n,k三数的大小,得出最小数min
(2)将min赋给i
(3)用三个数分别对这个数i取余,若有余数,则i-1,再取余,若仍有余数再i-1,继续循环,直到当三个数除以i余数都为零时,则最大公约数为i

算法思路基本与两个数的穷举法相似,所以没有画算法流程图。

三个整数的最小公倍数:

(1)先判断m,n,k三数的大小,得出最大数max
(2)定义s=1,l,
(3)将s*max赋给l
(4)先用max对三个数分别取余,若有余数,执行s++,再执行(3),则max*2,再取余,若仍有余数,则继续s++,执行(3),此时max*3继续循环,依次递增,直到余数都为零,最大公约数为l。

算法流程图:
这里写图片描述


源代码:

package Work;

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        System.out.println("请问你想计算几个正整数的最大公约数和最小公倍数呢?");
        System.out.println("                                           ");
        System.out.println("1.两个正整数                                          2.三个正整数  ");
        System.out.println("                                           ");
        int item1;
        Scanner in=new Scanner(System.in);
        item1=in.nextInt();//输入选择菜单项

        switch(item1){

            //选择菜单1,进行计算两个正整数的最大公约数和最小公倍数
            case 1: 
                System.out.println("请输入需要计算的两个数:");
                Scanner input=new Scanner(System.in);
                int a=input.nextInt();
                int b=input.nextInt();
                System.out.println("你想通过什么方法进行计算呢?请选择计算的方法...");
                System.out.println("1.辗转相除法");
                System.out.println("2.循环法");
                System.out.println("3.相减法");
                int item2;
                Scanner wr=new Scanner(System.in);
                item2=wr.nextInt();//输入选择菜单项

                switch(item2){
                    case 1:
                        int c1=divide(a,b); //通过调用函数divide得出最大公约数c1
                        System.out.println(a+"和"+b+"的最大公约数是:"+c1);
                        System.out.println("最小公倍数是:"+a*b/c1);
                        break;
                    case 2:
                        int c2=exhaustion(a,b);//通过调用函数exhaustion得出最大公约数c2
                        System.out.println(a+"和"+b+"的最大公约数是:"+c2);
                        System.out.println("最小公倍数是:"+a*b/c2);
                        break;
                    case 3:
                        int c3=subtraction(a,b);//通过调用函数subtraction得出最大公约数c3
                        System.out.println(a+"和"+b+"的最大公约数是:"+c3);
                        System.out.println("最小公倍数是:"+a*b/c3);
                        break;
                    default:
                        System.out.println("输入的选项不合适...");//若输入的菜单项不是上述数字,则返回提示信息
                        break;

                }
                break;

            //选择菜单2,进行计算三个正整数的最大公约数和最小公倍数
            case 2:
                System.out.println("请输入需要计算的三个数:");
                Scanner w=new Scanner(System.in);
                int i=w.nextInt();
                int j=w.nextInt();
                int k=w.nextInt();
                int c4=threeNumGCD(i,j,k);//调用函数threeNumGCD得出最大公约数c4
                int c5=threeNumLCM(i,j,k);//调用函数threeNumLCM得出最小公倍数c5
                System.out.println(i+","+j+","+k+"的最大公约数是:"+c4);
                System.out.println("最小公倍数是:"+c5);
                break;

            default:
                System.out.println("输入的选项不合适...");//若输入的菜单项不是上述数字,则返回提示信息
                break;
        }
    }


    //定义辗转相除法divide函数
    public static int divide(int m,int n){
        if(m<n){
            int temp=m;
            m=n;
            n=temp;
        }
        if(m%n==0){
            return n;
        }
        int r=m%n;//定义r为m除以n的余数
        while(r!=0){//当m和n余数不为零时将n赋给m,将r赋给n,继续取余,直到余数为零时最大公约数为n
            m=n;
            n=r;
            r=m%n;
        }
        return n;
    }


    //定义穷举法exhaustion函数
    public static int exhaustion(int m,int n){
        int min=m<n?m:n;//判断m,n 的大小,取小数赋值给min
        int i;
        for(i=min;;i--){//从两个数中最小的数min开始循环,用两个数分别对这个小数min取余,若有余数,则i-1,直到当余数都为零时,则最大公约数为i
            if(m%i==0&&n%i==0)
                break;
            }
        return i;
    }


    //定义相减法subtraction函数
    public static int subtraction(int m,int n){
        while(m!=n){//比较m和n的大小,若不等,则用大的数去减小的数,得到差,比较差与较小数的大小,若不等则继续循环,直到相减的两数相等
            if(m>n){
                m=m-n;
            }else{
                n=n-m;
            }
        }
            return m;
    }


    //定义计算三个数最大公约数的threeNumGCD函数
    public static int threeNumGCD(int m,int n,int k){
        int min,i;
        min=m<n?m:n;
        min=min<k?min:k;//算出三个数中的最小数
        for(i=min;;i--){//将最小数赋给i,用三个数分别对i取余,若有余数则i-1,再取余,若再有余数,再i-1,继续循环,直到三个数运算的余数都为零
            if(m%i==0&&n%i==0&&k%i==0){
                break;
            }
        }
        return i;
    }


    //定义计算三个数最小公倍数的threeNumLCM函数
    public static int threeNumLCM(int d,int e,int f){
        int max=d>e?d:e;
        max=max>f?max:f;//算出三个数中的最大数
        int s=1,l;
        while(true){//先用最大数max对三个数分别取余,若有余数,则max*2,再取余,若再都有余数,则max*3,继续循环,依次递增,直到余数都为零
             l=max*s;
             if(l%d==0&&l%e==0&&l%f==0){ 
                 break;
             }
             s++;
             }
        return l;
    } 
}

测试及调试截图:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


在算法设计思路中,我写出了每个算法的计算方法,以及它们各自的算法流程图,在主main函数中 ,程序是用switch-case选择结构来选择想要进行的方式,再调用每种算法的函数来实现的。

猜你喜欢

转载自blog.csdn.net/WendyRay/article/details/82432605