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

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

方法一:用短除法找出这两个自然数的所有公因子,将这些公因子相乘,得到这两个数的最大公约数

function getGDC(m,n){
    var gdc=1;
    for(var i=2;i<=m&&i<=n;i++){
        while(m%i==0&&n%i==0){
            gdc=gdc*i;
            m=m/i;
            n=n/i;
        }
    }
    return gdc;
}
 

方法二:用欧几里得算法,其基本思路是将两个数辗转相除直到余数为0

function getGDC(m,n){
    var r=m%n;
    while(r!=0){
        m=n;
        n=r;
        r=m%n;
    }
    return n;
}
/*使用递归代替循环
function getGDC(m,n){
    if(m%n==0){
        return n;
    }
    else{
        return getGDC(n,m%n);
    }
}*/

证明欧几里得算法

证明 GDC(a,b)=GDC(b,a mod b),其中a>b

令 r=a mod b,a可以被表示为 a=k* b+r ,r可以被表示为 r=a-k* b

假设d为(a,b)的一个公约数,即a和b都可以被d整除,则有 r/d=a/d-k *b/d

由等式右边可知 r/d 是一个整数,即d是r的一个约数,d是(b,a mod b)的一个公约数

因为(a,b)和(b,a mod b)的公约数相等,其最大公约数也相等

在编写代码时不用考虑让较大的数做被除数,较小的数做除数,因为若被除数小于除数,则余数为被除数,下次计算时的被除数就是较大数,除数是较小数。相较于被除数大于除数的情况只多了一次计算。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值