最大公约数&最小公倍数

5 篇文章 0 订阅

辗转相除法求最大公约数是一种常用的求两个数的最大公约数的方法。
方法是:以小数除大数,如果能整除,那么小数就是所求的最大公约数。
否则就用余数来除除数;再用新除法的余数去除刚才的余数。
依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数。

证明

证明思路

先假设 d d d a , b a,b ab的公约数,证明 d d d也是 b b b, a a a m o d mod mod b b b的公约数。
再假设 d d d b b b, a a a m o d mod mod b b b的公约数,证明 d d d也是 a , b a,b a,b的公约数。
最后推出 ( a , b ) (a,b) (a,b) ( b , a (b,a (b,a m o d mod mod b ) b) b)的公约数是一样的。

具体证明

a a a可以表示成 a = k b + r a = kb + r a=kb+r ( a , b , k , r 皆 为 正 整 数 , 且 r < b ) (a,b,k,r皆为正整数,且r<b) abkrr<b,则 r = a r = a r=a m o d mod mod b b b

假设 d d d a , b a,b a,b的一个公约数,记作 d ∣ a , d ∣ b d|a,d|b da,db,即 a a a b b b都可以整除 d d d
r = a − k b r = a - kb r=akb,两边同时除以 d d d r / d = a / d − k b / d = m r/d=a/d-kb/d=m r/d=a/dkb/d=m
由等式右边可知 m m m为整数,因此 d ∣ r d|r dr
因此 d d d也是 b b b, a a a m o d mod mod b b b的公约数。

假设 d d d b b b, a a a m o d mod mod b b b的公约数, 则 d ∣ b , d ∣ ( a − k ∗ b ) , k d|b,d|(a-k*b),k db,d(akb),k是一个整数。
进而 d ∣ a d|a da.因此 d d d也是 a , b a,b a,b的公约数。

因此 ( a , b ) (a,b) (a,b) ( b , a (b,a (b,a m o d mod mod b ) b) b)的公约数是一样的,其最大公约数也必然相等,得证。

最大公约数

代码实现非常简单。。
由上面的证明可以发现最大公约数具有递归性质,即 ( a , b ) (a,b) (a,b)的最大公约数和 ( b , a (b,a (b,a m o d mod mod b ) b) b)的最大公约数相等,由 ( a , b ) (a,b) (a,b)转化为其子问题 ( b , a (b,a (b,a m o d mod mod b ) b) b)
最后,若 b ∣ a b|a ba,那么 a a a m o d mod mod b = 0 b=0 b=0,就是递归边界。

#define LL long long
LL gcd(LL a,LL b) //最大公约数 
{
	if(b==0) 
		return a;
	return gcd(b,a%b);
}

最小公倍数

就是两个数相乘,然后除以他们的最大公约数。

LL lcm(LL a,LL b) //最小公倍数 
{
	return a*b/gcd(a,b);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值