欢迎访问宙启技术站
智能推送

编写一个Java函数,以计算两个整数之间的最大公约数

发布时间:2023-06-26 08:15:25

一个整数x的约数是可以整除x的整数。两个整数x和y的公约数是两个整数共同的约数。最大公约数是两个整数共有的最大约数。最小公倍数是两个整数的公倍数中最小的那个,即最小的正整数倍数。在本文中将介绍一个 Java 函数来计算两个整数之间的最大公约数。

方法1:使用欧几里得算法

欧几里得算法(也称为辗转相减法)是计算两个整数之间的最大公约数的一种简单而有效的方法。该算法的基本思想是迭代地减小两个整数之间的差,直到它们等于彼此,这就是它们的最大公约数。

代码实现如下:

public static int gcd1(int x, int y) {
    if (x < y) {
        int temp = x;
        x = y;
        y = temp;
    }
    if (x % y == 0) {
        return y;
    } else {
        return gcd1(y, x % y);
    }
}

上述代码中首先判断两个整数的大小,将大的赋值为x,小的赋值为y。如果y是x的除数,则y就是它们的最大公约数,否则迭代地计算x对y的余数,更新x和y,并重复该过程,直到y成为x的除数。这里使用了递归来实现欧几里得算法。

方法2:使用更相减损术

更相减损术是一种古老的算法,它也可以用来计算两个整数之间的最大公约数。该算法的基本思想是反复相减两个整数中比较大的那个,直到两个整数相等,这就是它们的最大公约数。

代码实现如下:

public static int gcd2(int x, int y) {
    if (x < y) {
        int temp = x;
        x = y;
        y = temp;
    }
    while (x != y) {
        if (x - y > y) {
            x = x - y;
        } else {
            int temp = x;
            x = y;
            y = temp - y;
        }
    }
    return x;
}

上述代码中也首先判断两个整数的大小,将大的赋值为x,小的赋值为y。然后进行循环迭代,不断将x-y的结果赋值给x,直到x和y相等,这时的x就是它们的最大公约数。

以上两个方法的时间复杂度都为O(logn),其中n是两个整数的大小之间的差值。这意味着它们在处理非常大的整数时效率比较高,但在处理小整数时会略微降低效率。