背景
求GCD在与求余有关的运算中经常使用。这里我只记录了目前我用的最顺手的一种算法–辗转相除法。效率可能比较慢,因为包含求余运算,但写起来很简单。有效率更高的算法的话,希望能在留言区留言。
原理
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数。
进而d|a.因此d也是a,b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
(摘自百度百科)
代码
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
注意无论a,b大小关系如何,均不影响答案。证明自行百度。