用辗转相除法求三个数的最大公约数和最小公倍数

发布于 2022-09-04 07:06:38 字数 1078 浏览 9 评论 0

三个数求最大公约数和求最小公倍数,可否用辗转相除法?
例如:
三个数求最大公约数:
先求前两个数的最大公约数a,然后用a和第三个数再求最大公约数b,得到三个数的最大公约数
三个数求最小公倍数:
先求前两个数的最小公倍数c:(第一个数×第二个数)/a
在用c和第三个数求最小公倍数d:(c 乘 第三个数)/b
得到的d就是三个数的最小公倍数

请问这个方法可行吗?
测试过几个数据,得到的最小公倍数是正确的,但是做题的时候两个测试点只通过了一个,请问有木有反例可举?

题:输入三个数,求他们的最小公倍数
代码:

import java.util.Arrays;  
import java.util.Scanner;  
  
public class Main {  
  
    public static void main(String[] args) {  
  
        Scanner in = new Scanner(System.in);  
        int[] arr = new int[3];  
        for(int i = 0;i<arr.length;i++){  
            arr[i] = in.nextInt();  
        }  
        Arrays.sort(arr);  
        //前两个数的公约数  
        int gy_1 = gy2(arr[0],arr[1]);  
        //三个数的公约数  
        int gy_2 = gy2(gy_1,arr[2]);  
        //开始求前两个数的公倍数  
        int gb_1 = (arr[0]*arr[1])/gy_1;  
        int gb_2 = (gb_1*arr[2])/gy_2;  
        System.out.println(gb_2);  
    }  
    //两个数求最大公约数  
    public static int gy2(int a,int b){  
        if(b==0) return a;  
        return gy2(b,a%b);  
    }  
          
}  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2022-09-11 07:06:38

求a, b最小公倍数必须是lcm(a, b) = |a*b| / gcd(a, b),在你的代码中

int gb_2 = (gb_1*arr[2])/gy_2;

int gy_2 = gy2(gy_1,arr[2]);

显然,此时的gy_2并不是gb_1与arr[2]的最大公约数,而是gcd(gy_1, arr[2])。
gb_1是gy_1的倍数,所以gcd(gb_1, arr[2])可以整除gcd(gy_1, arr[2])。当测试样例中gcd(gb_1, arr[2]) != gcd(gy_1, arr[2])时,结果就会错误,比如2 4 8

int gb_1 = a * b / gcd(a, b);
int gb_all = gb_1 * c / gcd(gb_1, c);
private int gcd(int a, int b) {
    if (a < b)
        swap(a, b);
    return (b == 0) ? a : gcd(b, a % b);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文