最大公约数:
正整数a与b的最大公约数是指a与b的所有公约数中最大的那个公约数。一般用gcd(a,b)来表示a和b的最大公约数,而求解最大公约数的常用方法便是欧几里得算法(即辗转相除法)
欧几里得算法基于以下定理:
设a,b为正整数,gcd(a,b)=gcd(b,a%b)
当a<b时,需要交换a与b的位置;当a>b时,通过定理数据规模会变小的非常快,直到遇到0的情形才结束。
于是得到以下递归形式的代码:
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 );
}
最小公倍数:
正整数a与b的最小公倍数是指a和b所有公倍数中最小的那个公倍数。最小公倍数的计算只在最大公约数的基础上进行的,当得到a和b的最大公约数d,便可以直接由ab/d得到最小公倍数。
a和b的最大公约数便是集合a和b的交集,而最小公倍数则是它们的并集。要得到并集,由于ab会使公因子部分重复计算一次,需要除掉一次公因子,这样便可得到a和b的最小公倍数ab/d。因为ab可能造成溢出,因此需要改写成a/d*b。
int lcm(int a,int b)
{
int d = gcd(a,b);
return a/d*b;
}