栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java编程】输出两个数或N个数的最大公约数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java编程】输出两个数或N个数的最大公约数

题目

输入两个或多个正整数,输出它们的最大公约数,例:

  • 输入:25 10 15
  • 输出:5
1、思路分析

首先,需要明确什么叫最大公约数,即几个数中公有的最大的因数。
其次,怎么求解最大因数呢?一个数,我们可以求出所有的质因子,那多个数呢?显然也能。
最后,通过下面的图解(待画…)分析得知,最大公约数=所有公有的质因子的乘积。

2、初步实现 2.1、两个整数的最大公因数
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String[] str = sc.nextLine().split(" ");
            int number1 = Integer.parseInt(str[0]);
            int number2 = Integer.parseInt(str[1]);

            List list = new ArrayList<>();
            Main.getFactor(list, number1, number2);

            System.out.print(number1 + "与" + number2 + "的公有质因子为:");
            list.forEach(integer -> System.out.print(integer + " "));
            System.out.println();
            int result = 1;
            for (Integer integer : list) {
                result = result * integer;
            }
            System.out.println("最大公因子为:" + result);
        }
    }

    private static void getFactor(List list, int number1, int number2) {
        int number = Math.min(number1, number2);
        for (int i = 2; i <= number; i++) {
            if (number1 % i == 0 && number2 % i == 0) {
                list.add(i);
                Main.getFactor(list, number1 / i, number2 / i);
                return;
            }
        }
    }
}
2.2、调试结果

  • 两个互质的整数为什么没有求出公有质因子1呢?

可以看到,已经初步实现两个数的最大公因数的求解,但是当输入的两个互质的整数时,在list中并没有存放最大公因数1,我认为1只能算是最大公因数,但是并不算公有的质因子,因为质因数需要大于等于2,如果这里加入list.add(1)也是可以的,看自己的理解。

private static void getFactor(List list, int number1, int number2) {
    int number = Math.min(number1, number2);
    for (int i = 2; i <= number; i++) {
        if (number1 % i == 0 && number2 % i == 0) {
            list.add(i);
            Main.getFactor(list, number1 / i, number2 / i);
            return;
        }
    }
    list.add(1);
}
  • 当输入的为两个以上的正整数时,如何得出最小的那个数?

当输入数为两个整数时,可以通过int min = Math.min(number1, number2)获取,但是当数为多个的时候呢?我们可以利用List的有序性,如果进入递归的List本身就是有序的,那么int min = list.get(0)就是最小的数。

// 这里使用Java8的流快速的对输入的字符串数组进行类型转换和排序处理
String[] str = sc.nextLine().split(" ");
List inputNumbers = Stream.of(str).map(Integer::parseInt).sorted().collect(Collectors.toList());

// 排序后,在递归里面首个元素就是最小元素
int min = inputNumbers.get(0);
3、完整示例

求两个或多个正整数的最大公约数,

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String[] str = sc.nextLine().split(" ");
            List inputNumbers = Stream.of(str).map(Integer::parseInt).sorted().collect(Collectors.toList());
            List list = new ArrayList<>();
            getFactor(list, inputNumbers);
            int result = 1;
            for (Integer integer : list) {
                result = result * integer;
            }
            System.out.println(result);
        }
    }

    private void getFactor(List list, List inputNumbers) {
        int min = inputNumbers.get(0);
        for (int i = 2; i <= min; i++) {
            boolean flag = true;
            for (Integer inputNumber : inputNumbers) {
                flag = flag && inputNumber % i == 0;
            }
            if (flag) {
                list.add(i);
                // 这是流的特性,直接用i会报编译错误。
                int finalI = i;
                List newInputNumbers = inputNumbers.stream().map(integer -> integer / finalI).collect(Collectors.toList());
                getFactor(list, newInputNumbers);
                return;
            }
        }
        list.add(1);
    }
}

上述代码输出结果如下,已经满足题目要求(可以去掉公有质因子的输出)。


上述思路方案仅供参考,欢迎补充更多更好的方案!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号