最大公约数,最小公倍数

首先记录两种求最大公约数的方法如下

1.辗转相除法(欧几里得算法)

具体的数学证明可以自行百度,博主数学不好,觉得知道这几个点就够了

前提是a>=b,if a%b == 0 then gcd(a,b) == b

else if a = bn+r then gcd(a,b) = gcd(b,r)...,那我们的任务就是在程序中判断两个参数之间能够整除即可

int gcd(int a,int b){
    int tmp;
    if(a < b){//确保前提a>=b
        tmp = a;
        a = b;
        b = tmp;
    }
    tmp  = 1;
    while(tmp != 0){
        tmp = a % b;
        if(tmp){
            a = b;
            b = tmp;
        }
    }
    return b;
}
2.更相减损法

更相减损实际上是辗转相除思想的另一种实现,但是运算方法靠的是减法,因此它的效率特别是在两个参数

相差较大的时候,就会显得慢一些。

int gcd(int a,int b){
    int t = 1,tmp;
    while(true){
        if(a%2 == 0 && b%2 == 0){
            t *= 2;
            a /= 2;
            b /= 2;
        }
        if(a < b){//确保前提a>=b
            tmp = a;
            a = b;
            b = tmp;
        }
        tmp = a - b;
        if(tmp == b){
            return b*t;
        }else{
            a = tmp;
        }
    }
}

相比之下如果求两个数的最小公倍数的话,也是要借助最大公约数的

lcd(a,b) = a*b/gcd(a,b);

这里就不再给出程序以及证明了。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值