求两数最大公因数的解释

转发自:Leetcode-cn

python3代码实现:
def gcd(a,b):
	if a % b == 0 : return b
	return gcd(b,a%b)

先说操作步骤,然后再讲这么做的原理是什么

若两数相等则一定不互质
若两数不等,分别为a和b,不妨设a>b
则a和b的最大公约数就是b和a%b的最大公约数
递归进行,若 a%b=0时,则返回b
下面解释每一步的意思和原理,这里主要说明一下第3步的原理
在纸上一长一短两条直线,长的代表a,短的代表b
在两条线段上各从头开始截取长度相等的线段p(线段长度代表最大公约数,但要确保两条直线都能正好被截取完)
那么两数的约去最大公约数得到的最简互质数对就是两条直线上线段的个数
当a对b进行求余操作时(a是大的数),余下来的那部分的线段个数和b的线段个数依然互质(可用反证法来证明),且余下来的那部分线段和b依然可以整除线段长度p,而p是a和b的最大公约数,因此p也是余下的那部分直线长度(即a%b)和b的最大公约数
而b一定大于等于a%b,因此可以将b当作长直线,a%b当作短直线进入下一轮递归
当较长的那根直线长度正好是较短那根直线长度的整数倍时候(即a%b=0时),就代表较短直线上的线段只有一个了,而较长的直线上的线段个数有若干个,两线段数互质,所以可直接返回较短直线的长度就是最大公约数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值