求n个数的最大公约数及最小公倍数

一、题目分析
简单地说:就是求n个数的最大公约数、最小公倍数
复杂的说:还是求n个数的最大公约数、最小公倍数
哈哈哈,其实在之前的博客中列举了求解两个数的最大公约数的算法,
但是请注意这里的数据比较高大上一点,是n;
接下来:就是就是就是
我的分析思路:与大家共勉
(1)运用4种求解最大公约数算法写出求解两个数最大公约数的方法;
(2)调用求解两个数的最大公约数方法,对n个数依次进行两两比较;
(3)求解最小公倍数也是同理,先求出两个数的最小公倍数,再依次对n个数求解;
二、程序分析
1.程序组成:
1.1 两个类:
(1)Num类:求n个数的最大公约数、最小公倍数
(2)Test类:测试类
1.2 六个方法
1.2.1 int Max(int a, int b){}
功能:求两个数的最大公约数

/**
     * @param: [a, b]
     * @return: int
     * @Description:求两个数的最大公约数(穷举法)
     */
    public static int Max(int a, int b) {

        int temp = a < b ? a : b;
        while (temp > 0) {
            if (a % temp == 0 && b % temp == 0) {
                break;
            }
            temp--;
        }
        return temp;
    }

1.2.2 int Min(int a, int b){}
功能:求两个数的最小公倍数

/**
     * @param: [a, b]
     * @return: int
     * @Description:求两个数的最小公倍数
     */
    public static int Min(int a, int b) {
        return (a * b / Max(a, b));
    }

1.2.3 int MaxDivisor(int[] array, int n){}
功能:求n个数的最大公约数

/**
     * @param: [array, n]
     * @return: int
     * @Description:求n个数的最大公约数(递归实现)
     */
    public static int MaxDivisor(int[] array, int n) {
        int c = array[0];
        for (int i = 1; i < n; i++) {
            if (array[i] == 0) {
                continue;
            }
            c = Max(c, array[i]);
        }
        return c;
    }

1.2.4 int MinMultiple(int[] array, int n){}
功能:求n个数的最小公倍数

/**
     * @param: [array, n]
     * @return: int
     * @Description:求n个数的最小公倍数(递归实现)
     */
    public static int MinMultiple(int[] array, int n) {

        int c = array[0];
        for (int i = 1; i < n; i++) {
            if (array[i] == 0) {
                return array[i];
            }
            c = Min(c, array[i]);
        }
        return c;
    }

1.2.5 int Input(int[] data, int n){}
功能:输入计算数的值

/**
     * @param: [data, n]
     * @return: int
     * @Description:输入计算数的值
     */
    public static int Input(int[] data, int n) {
        int num;
        if (n < 2) {
            System.out.println("输入个数非法,请重新输入");
            return 0;
        }
        System.out.println("请输入数字值:");
        for (int i = 0; i < n; i++) {
            System.out.println("输入" + (i + 1) + "个整数: ");
            Scanner keyboard = new Scanner(System.in);
            //当输入不是数字时,抛出异常-输入数据类型错误
            try {
                num = Integer.parseInt(keyboard.nextLine().trim());
                data[i] = num;
            } catch (NumberFormatException nfe) {
                System.out.print("输入数据类型错误!你必须输入数值数据!\n");
                return 0;
            }
        }
        return 0;
    }

1.2.6 int main(){}

public static void main(String[] args) {
        int flag = 1;
        Num num = new Num();
        //建立循环,可多次选择计算
        while(flag == 1){
            System.out.print("请输入数字个数:");
            int n = new Scanner(System.in).nextInt();

            int[] data = new int[n];
            if(n != 0){
                //输入数据
                num.Input(data,n);
                System.out.println("最大公约数为:"+num.MaxDivisor(data,n));
                System.out.println("最小公倍数为:"+num.MinMultiple(data,n));
            }
            System.out.println("继续计算选择1,退出选择0");
            flag = new Scanner(System.in).nextInt();
        }

    }

2.流程图
在这里插入图片描述
三、调试
1.当输入个数时,输入非数字会出现异常
在这里插入图片描述
2.调试后,对非数字字符进行了处理
在这里插入图片描述
四、测试
1.个数非法
在这里插入图片描述
2.内容非法
在这里插入图片描述
五、运行结果
在这里插入图片描述
六、个人心得
在求n个数的最大公约数、最小公倍数的问题中,可以转化为对n个数依次两两进行求解的问题,虽然这个方法不是很优化,但是可以解决基本问题。期待我的脑洞大开,找出更优化的方法,哈哈哈

猜你喜欢

转载自blog.csdn.net/weixin_44369212/article/details/88751727