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;
}//就很简单了。。。


十八闲客
7 声望1 粉丝

引用和评论

0 条评论