两个数的最大公约数
- 1.辗转相除法求解两个数的最大公约数
- 2.更相减损术求解两个数的最大公约数
- 3.不严格理解
1.辗转相除法求解两个数的最大公约数
辗转相除法:两个正整数a和b(a>b)的最大公约数等于a除以b的余数与b 之间的最大公约数。–如果a能被b整除,那么a和b之间的最大公约数为b.
def gcd(a,b):while(a%b!=0):m=a%ba=bb=mreturn b
2.更相减损术求解两个数的最大公约数
更相减损术:两个正整数a和b(a>b)的最大公约数等于a-b的差值c和b的最大公约数。
def gcd(a,b):while(a!=b):c=a-ba=max(c,b)b=min(c,b)return b
3.不严格理解
更相减损术原理讲解,参看博文:http://blog.sina.com.cn/s/blog_5253930a0102y5p8.html
辗转相除法原理:
1.假设a=b∗k+ra=b*k+ra=b∗k+r
2.将b拆成最小因数相乘:n=c∗d∗en=c*d*en=c∗d∗e,那么a=k∗c∗d∗e+ra=k*c*d*e+ra=k∗c∗d∗e+r
3.如果r是b的因数,则b中有一个或多个因数乘积可构成r,假设r=c*d
4.a=k∗c∗d∗e+r=k∗c∗d∗e+c∗d=c∗d(k∗e+1)a=k*c*d*e+r=k*c*d*e+c*d=c*d(k*e+1)a=k∗c∗d∗e+r=k∗c∗d∗e+c∗d=c∗d(k∗e+1),则r也为a的因数
5.因为(k∗e+1)(k*e+1)(k∗e+1)与k∗ek*ek∗e是相邻的两个数,没有除了1之外的公约数,所以a和b的最大公约数为r
综上就是通过不断的相除,找到是b因数的r.