看不懂辗转相除法求最小公约数?以身相许那种哦!

给你打个比喻吧:你英雄救美了,美女想要报答你,你想要1000块感谢费,但是美女却想要以身相许😁,懂了吧,同样都是报答,只是用了不一样的方式,辗转相除法也是这样,你两个数的最大公约数不容易求,我就用另外两个简单的数来解决。

下载.jpg

废话不多说,看定理。

定理:

辗转相除 可以求最大公约数,顾名思义,反复的除,最终得到两数的最大公约数。
首先我们来分析下定理:

定理:两个整数最大公约数等于其中较小的那个数两数相除余数最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)

文字不好理解,举个实例:
134 / 18 = 7 … 8
18 / 8 = 2 … 2
8 / 2 = 4 … 0

看清了吧,是不是和定理一模一样,所以我们要找最大公约数,而134 /18的和8 / 2的最大公约数相等,所以我们只需要求出8 / 2的最大公约数,是不是就是开头说的换了两个数再求,而我们要知道,因为两数相除,余数为0,其除数必定为最大公约数,所以这里的2也就是我们要找的138 / 18 的最大公约数。至于证明,百度搜索,都有。主要证明思路就是,有a/b余r一式, 先假设y为a,b的公约数,再证明b,r的公约数也为y。

思路:

通过定理我们知道,要计算两数最大公约数,我们只需要一直递归就行了,直到余数为0,最大公约数就是较小的那个数(除数)。递归相信大家都了解过吧,必定有一出口,保证程序停止或返回,那么这里的出口条件就是上面例子的2,即余数为0。程序就是先找出输入参数谁打谁小,再判断余数是否为0(出口),再递归。代码用java写的,其实没啥差别,也没用api,思路都一样,格式不一样罢了。

代码:

所以我们开始写代码了:

private static void method4(int m, int n, int ji) {
        //相比较两个数,把较小的那个数赋值给smallNum;
        int smallNum = (m > n ? n:m);
        int bigNum = (m > n ? m:n);
        if ( n < 0 || m < 0 ){
            System.out.println("输入有错,结束了");
        }else{
            //余数为0,smallNum就是那个最大公约数
            if (bigNum % smallNum == 0){
                System.out.println("最小公倍数"+(ji / smallNum)+"   最大公约数"+smallNum);
                //我写了几种方法,方便调用,所以返回的空
                return;
            }
            method4(smallNum,bigNum % smallNum, ji);
        }
    }

通过定理我们知道较小数为除数吧,所以我们直接每次递归时,就把较小那个值找出来。然后把它变成除数,不就行了吗。

什么你还没学递归,不要紧,我还有一种方法,就是while循环,while循环就不用判断谁大谁小了,因为小数%大数=小数本身,代码搞起来:

private static void method2(int m ,int n,int ji) {
        while(true){
            if ((m = m % n) == 0){
                System.out.println("最大公约数"+n);
                System.out.println("最小公倍数"+(ji / n));
                System.exit(0);
            }
            if ((n = n % m) == 0) {
                System.out.println("最大公约数"+m);
                System.out.println("最小公倍数"+(ji / m));
                System.exit(0);
            }
        }
    }

其实我还有一种枚举的算法,就不写了。当然求解最大公倍数,辗转相除还不是最优,还有更优,大家可以搜搜看。如果有时间,我在补充其他的算法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值