朴素的求最大公约数方法是 对于所要求最大公约数的a,b,枚举从 min(a,b) 到 1的数,看看那个数满足 a % x && b% x == 0
辗转相除法对其起到了极大的优化,它的核心依据是 a和b的最大公约数是也是 b和a%b 的最大公约数
下面我们来证明一下
假设 :a和b的最大公约数是r。
那么a可以整除r,b也可以整除r。因为a % b = a - k * b,很容易知道,
(a - k * b)/ r = a / r - k * b / r 因此a%b 一定也可以整除r
上代码
int gcd(int a, int b)
{
if( b==0 )return a;//上面那层递归实例的 b是这层的a b==0 说明上面一层的 a%b == 0了
return gcd(b, a%b);
}
可能会有同学疑问,如果a<b算法还能正确吗,这里不多解释了,可以自己带值进去试试模拟一下过程