GCD
辗转相除得最大公约数。(也叫经典的欧几里得算法)
a,b两个数,小的那个假如a,另一个数就变小为b%a。
然后不断递归下去,就能得到最大公约数gcd。
code:
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
时间复杂度logn,非常快。
下面解释下原理:
1.首先a,b哪个先来被模不重要,辗转一次就一定能得到小的那个了。
2.然后进行证明:
假设a=b*c+d
设a=kA,b=kB。
那么d=a-bc,即d=Ak-Bkc,提个k,d=A-B*c。
这个时候d一定是整数,因为整数在[加,减,乘]的运算下是封闭的。
所以就模后的数就和除数,被除数有相同的公约数,就可以无限递推下去了。
LCM
code:
int lcm(int a,int b){
return a/gcd(a,b)*b;
}//就很简单了。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。