Java求两个自然数的最大公约数

 

 

 

1、递减法,时间复杂度有点高:o(n)

public class Maximum {

    public static void main(String[] args) {
      
        System.out.println("result:"+getCommonNum(13, 11));

    // System.out.println("result:"+getCommonNum1(6, 12));
    }

    private static String getCommonNum(Integer a, Integer b) {
        if(a <= 0 || b <= 0) {
            return "零或负数无最大公约数";
        }
        if(a.compareTo(b) == 0) {
            return "最大公约数为:"+a;//相同则互为最大公约数
        } else {
            int temp;
            if(a.compareTo(b) < 0) {
                temp = b;
                b = a;
                a = temp; //互换保证a>b
            }
            int c = b;
            while (c > 1) {//等于1时候最大公约数就是b本身。
                if(a%c == 0 && b%c == 0)  {//第一次能除开就是最大的约数
                    break;
                }
                c--;//c从b开始递减;
            }
            return "最大公约数为:" + c;
        }
    }
}

2、辗转相除法,效率高

private static String getCommonNum1(Integer a, Integer b) {
    if(b == 0) {
        return "最大公约数"+a;
    }
    return getCommonNum1(b, a%b);
}

原理: 利用递归方式找到最大公约数

1:a/b = q 余数是r1  

      如果r1 = 0,则说明a是b的整数倍,最大公约数就应该是b

      如果r1  != 0,则说明a不是b的整数倍,b/r1 = p余数是r2

                        如果r2 =0,则说明最大公约数就应该是r1

                        如果r2 !=0, 则说明最大公约数不是r1, 继续上述操作。r1/r2=w...r3

                                      如果r3.......

例子:(12,10)

12/10=1...2      

(10,2)

10/2=5...0

此时进入递归a=2,b=0时遇到代码if(b == 0) { return "最大公约数"+a; }跳出循环最大公约数为2.

 

3、交替相减法;最大时间复杂度也很高。

private static String getCommonNum2(Integer a, Integer b) {
    if(b == a) {
        return "最大公约数"+a;
    }
    if(a > b) {
        return getCommonNum2(a - b, b);
    }else {
        return getCommonNum2(b - a, a);
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值