最大公约数
正整数a与b的最大公约数是指a与b的所有公约数中最大的那个公约数,例如4和6的最大公约数为2;3和9的最大公约数为3。
一般用 gcd(a, b)来表示a和b的最大公约数,而求解最大公约数常用欧几里得算法(即辗转相除法)。
欧几里得算法基于下面这个定理:
设a、b均为正整数,则gcd(a, b)= gcd(b, a %b)。
由上面这个定理可以发现,如果a<b,那么定理的结果就是将a和b交换;如果a>b,那么通过这个定理总可以将数据规模变小,并且减小得非常快。
这样似乎可以很快得到结果,只是还需要一个东西:递归边界,即数据规模减小到什么程度使得可以算出结果来。
很简单,众所周知: 0和任意一个整数 a的最大公约数都是a (注意:不是0),这个结论就可以当作递归边界。由此便可以写出递归形式
①递归式: gcd(a, b)= gcd(b, a% b)
②递归边界: gcd(a, 0)= a
递归函数写法:
int gcd(int a,int b)
{
if(b==0)return a;
else return gcd(b,a%b);
}
最小公倍数
正整数a和b的最小公倍数是指a和b的所有公倍数中最小的那个公倍数,例如4和6的最小公倍数为12;3和9的最小公倍数为9。
最小公倍数需要在最大公约数的基础上进行。假设a和b的最大公约数是d,那么a和b的最小公倍数是a*b/d。
但是在程序竞赛中a*b基本上都会有测试点考验溢出问题,因此写成a/d * b更恰当,因为这不需要考虑溢出问题。