题目

辗转相除法可以求得最大公约数。举个例子演示这个算法的流程,如求1515和600的最大公约数:
第一次:用1515除以600,商2余315;
第二次:用600除以315,商1余285;
第三次:用315除以285,商1余30;
第四次:用285除以30,商9余15;
第五次:用30除以15,商2余0。
所以,1515和600的最大公约数是15。

算法

使用递归算法

    /**
     * 以递归的方式求最大公约数
     *
     * @param num1
     * @param num2
     * @return
     */
    public static int getMaxCommonDivisorByRecursion(int num1, int num2) {
        //被除数
        int dividend = num1 > num2 ? num1 : num2;
        //除数
        int divisor = num1 < num2 ? num1 : num2;
        int remainder = dividend % divisor;
        if (remainder == 0) {
            return divisor;
        } else {
            return getMaxCommonDivisorByRecursion(divisor, remainder);
        }
    }

使用循环算法

    /**
     * 以循环的方式求最大公约数
     *
     * @param num1
     * @param num2
     * @return
     */
    public static int getMaxCommonDivisorByCycle(int num1, int num2) {

        //被除数
        int dividend = num1 > num2 ? num1 : num2;
        //除数
        int divisor = num1 < num2 ? num1 : num2;
        while (true) {
            int remainder = dividend % divisor;
            if (remainder == 0) {
                break;
            }
            dividend = divisor;
            divisor = remainder;
        }
        return divisor;
    }

tfnkhcel
7 声望0 粉丝