最大公约数
最小公倍数是基于辗转相除法的原理,即gcd(a,b)=gcd(b,a%b),证明如下:
设a=kb+r,k和r分别为a除以b的商和余数,则r=a-kb,设d为a和b的一个公约数,那么不难看出d也是r的一个约数,因此d为b和r的一个公约数。而r=a%b,因此d既是a和b的公约数,也是b和a%b的公约数。
代码实现
int gcd(int a,int b)
{
if(b==0) return a;//0和任意一个整数的最大公约数都是这个整数,因此把0作为边界
else return gcd(b,a%b);
}
需要注意的是如果a<b那么就把a和b交换后再进行计算
最小公倍数
最小公倍数是在求最大公约数的基础上进行的,其结果为ab/d ,d为a和b的最大公约数,证明如下:
a和b的最大公约数即是a和b求并集,最大公约数即为a和b求交集。要得到并集,由于ab会使公因子部分多算了一遍,所以需要除掉一次公因子。
但是由于ab在计算的时候可能溢出,所以更恰当的写法是a/d*b。