求两个数最大公约数和最小公倍数的简便方法

求两个正整数a,b的最大公约数p和最小公倍数q。

最原始的方法是,p初始化为min(a, b),这里假设a < b,则p = a,

                              然后检测p能否同时整除a,b,是则停止循环,

                              否则令p -= 1,继续检测

对于q,则将其初始化为max(a,b) = b, 则q = b,

                              检测q能否同时被a和b整除,是则停止循环,

                              否则令q += 1,继续检测

可以看出这样计算效率很低,耗时大,简单的方法是采用欧几里德算法来求最大公约数,而利用(a * b) / p来求最小公倍数。

辗转相除法---欧几里德算法

以计算(1397,2413)的最大公约数为例:

以大数2413为被除数,以小数1397为除数,相除得:商为1,余数为1016

以大数1397为被除数,以小数1016为除数,相除得:商为1,余数为381

以大数1016为被除数,以小数381为除数,相除得:商为2,余数为254

以大数381为被除数,以小数254为除数,相除得:商为1,余数为127

以大数254为被除数,以小数127为除数,相除得:商为2,余数为0

直到能整除,则127就是最大公约数

数学证明:

b = as + r (0 <= r <= b -1),

若r=0, 显然最大公约数为a;

若r != 0, 由于b = as + r, 每个能整除a,r的整数都能整除b,则它能同时整除a,b

               又,r = b - as, 每个能整除a,b的整数都能整除r,则能整除a,r

因此,a,b的最大公约数和a,r的最大公约数相等。

do{
      r = b % a;
      b = a;
      a = r;
}while(!r)
     


递归的算法:

 

void gcd(int a, int b)
{
    int m;
    if (a > b)
        return gcd(b, a);
    if (b % a != 0)
        return gcd(a, b % a);
    else
        return a;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值