参考:http://blog.csdn.net/niushuai666/article/details/7278027
最大公约数
最大公约数(英语:greatest common divisor,gcd),指两个或多个整数共同具有的最大约数,记为 {\displaystyle (a_{1},a_{2},\dots ,a_{n})} {\displaystyle (a_{1},a_{2},\dots ,a_{n})}或 {\displaystyle \gcd(a_{1},a_{2},\dots ,a_{n})} {\displaystyle \gcd(a_{1},a_{2},\dots ,a_{n})}
最大公约数求法:
穷举法:分别列出两整数的所有约数,并找出最大的公约数。
素因数分解:分别列出两数的素因数分解式,并计算共同项的乘积。
短除法:两数除以其公同素因数,直到两数互素时,所有除数的乘积即为最大公约数。
辗转相除法:两数相除,取余数重复进行相除,直到余数为 {\displaystyle 0} {\displaystyle 0}时,前一个除数即为最大公约数
辗转相除法的证明
设两数为a、b(a > b),求它们最大公约数的步骤如下:
设q = a / b,r = a % b, 得a=bq+r(0≤r<b)。
1)若r = 0, 则b是a和b的最大公约数。
2)若r≠0,则继续考虑。首先,应该明白的一点是任何 a 和 b 的公约数都是 r 的公约数。要想证明这一点,就要考虑把 r 写成 r=a-bq。现在,如果 a 和 b 有一个公约数 d,而且设 a=sd , b=td, 那么 r = sd-tdq = (s-tq)d。因为这个式子中,所有的数(包括 s-tq )都为整数,所以 r 可以被 d 整除。对于所有的 d 的值,这都是正确的;所以 a 和 b 的最大公约数也是 b 和 r 的最大公约数。因此我们可以继续对 b 和 r 进行上述取余的运算。这个过程在有限的重复后,可以最终得到 r=0 的结果,我们也就得到了 a 和 b 的最大公约数。
int gcd(int a,int b)
{
return (b==0) ? a : gcd(b,a%b);
}```
**最小公倍数**
最小公倍数证明:
最小公倍数 = 两数之积 / 最大公约数(可以了解一下短除法)
证明:
设a,b两个整数,最大公约数为gcd,最小公倍数为lcm。
则a = k1 * gcd, b = k2 * gcd
lcm = a * t1 = k1 * gcd * t1 = p * k1;
lcm = b * t2 = k2 * gcd * t2 = q * k2;
又因为gcd(k1, k2) = 1,所以lcm = k1 * k2 * gcd = a * b / gcd;
所以,最小公倍数 = 两数之积 / 最大公约数
T LCM(T a, T b) {
return a * b / GCD(a, b);
}
“`