Q:如何基于辗转相除法(欧几里得算法)求最大公约数
A:
欧几里得算法:两个正整数a,b,其最大公约数为其除数和余数的最大公约数,即gcd(a,b)=gcd(b, a%b)
利用这个式子可以求的原因是:当a>b时,两个数会很快减小;当a<b时,此时两个数字会交换。
直到达到其边界:当一个数为0时,另外一个数为最大公约数。即gcd(a,0)=a
int gcd(int a, int b) {
if (b == 0) return a;
else return gcd(b, a%b);
}
Q:如何求最小公倍数
A:
两个正整数a,b及其最大公约数d=gcd(a,b),求最小公倍数lcm(a,b) 形象理解最大公约数时指a,b的交集,而最小公倍数则是并集。知道这个概念则可知lcm=a*b/d 为了避免溢出,应该调换顺序a/d*b