编程之美 set 3 最大公约数问题
解法
1. f(x,y) = f(y, y%x) (y>0) 辗转相除法
2. 取模运算较为耗时, 将取模变成相减. 但对极端数据效果很差, 比如 gcd(1000,1)
3. 分析公约数的特点.
3.1 若 x,y 均为偶数, 那么 f(x,y) = 2*f(x/2, y/2)
3.2 若 x 为偶数, y 为奇数, 那么 f(x,y) = 2*f(x/2, y)
3.3 若都为奇数, f(x,y) = f(x, x-y) 那么下一步肯定有一个偶数
3.4 这样一来, 时间复杂度下降到 o(log(max(x,y)))