5.2.1 最大公约数
正整数a与b的最大公约数是指a与b的公约数中最大的那一个。例如4和6的最大公约数为2。一般用gcd(a,b)来表示a和b的最大公约数。而求解最大公约数常用欧几里得算法(辗转相除法)。
欧几里得算法基于下面定理:
设a,b均为正整数,则 gcd(a,b) = gcd(b,a%b)
于是可以用下面代码求解:
int gcd( int a , int b ){
if( b == 0 ){
return a ;
}
else{
return gcd(b , a%b) ;
}
}
更简洁的写法是:
int gcd( int a , int b ){
return !b ? a : gcd(b , a%b) ;
}
5.2.2 最小公倍数
一般用lcm(a,b)来表示a和b的最小公倍数。最小公倍数的求解在最大公约数的基础上进行。当得到a和b的最大公约数d之后,可以马上得到a和b的最小公倍数是ab/d
由于ab在实际计算时可能溢出,因此更恰当的写法是a/d*b。由于d是a和b的最大公约数,因此a/d一定可以整除。
int lcm( int a , int b ){
int d = gcd(a , b) ;
return a/d*b ;
}