全程抄書spa
想要進一步提升求 \(\gcd\) 的效率,能夠經過不斷去除因子 \(2\) 來下降常數,這就是「二進制 \(\gcd\) 」code
若 \(x = y\) ,則 \(\gcd(x, y) = x\) 不然:class
若 \(x, y\) 均爲偶數,則 \(\gcd(x, y) = 2 * \gcd(x / 2, y / 2)\)效率
若 \(x\) 爲偶數, \(y\) 爲奇數, 則 \(\gcd(x, y) = \gcd(x / 2, y)\)二進制
若 \(x\) 爲奇數, \(y\) 爲偶數, 則 \(\gcd(x, y) = \gcd(x, y / 2)\)gc
若 \(x, y\) 均爲奇數,則 \(\gcd(x, y) = \gcd(x - y, y)\)di
int Gcd(int x, int y){//二進制GCD int i = 0, j = 0; if(x == 0) return y; if(y == 0) return x; while((x & 1) == 0) x >>= 1, ++i; while((y & 1) == 0) y >>= 1, ++j; if(j < i) i = j; while(1){ if(x < y) x ^= y, y ^= x, x ^= y; if(0 == (x -= y)) return y <<= i; while(0 == (x & 1)) x >>= 1; } }