首先看下辗转相除法的递归及非递归代码实现:
<span style="font-size:18px;">//递归实现
int gcd(int a,int b) {
return b?gcd(b,a%b):a;
} </span>
<span style="font-size:18px;">//非递归实现
int gcd(int a,int b)
{
int t;
while(b)
{
t = a;
a = b;
b = t%b;
}
return a;
}</span>
代码实现不难,不过怎么证明呢?
其实从递归代码不难看出只要证明gcd(a,b) = gcd(b,a%b)取余即可。
我们知道有这样一个等式:a = b*q+r,那么r = a-b*q = d(m-n*q),所以显然a,b的最大公约数d也是r的因数,所以b,r 必有一个约数d,那么为什么d一定是b,r的最大公约数呢?
回过头来看a = b*q+r,我们可以采用反证法,假设存在D>d为b,r的公约数,那么显然a,b的最大公约数就变为D了,与