求最大公約數的高效率演算法
阿新 • • 發佈:2019-01-23
宣告:下文中的演算法與數學原理,都是從《程式設計之美》的2.7節中的解法三看到後,摘抄和修改而來的。
數學原理公式: 若x,y均為偶數,f(x,y) = 2 * f(x/2,y/2); 若只x均為偶數,f(x,y) = f(x/2,y);若只y均為偶數,f(x,y) = f(x,y/2);
若x,y均為奇數,f(x,y) = f(y, x- y);(兩個奇數相減,必得偶數)
public static int gcd(int x, int y) { if (x < y) { return gcd(y, x); } if (y == 0) { return x; } else { if (isEven(x)) { if (isEven(y)) { return (gcd(x >> 1, y >> 1) << 1); } else { return gcd(x >> 1, y); } } else { if (isEven(y)) { return gcd(x, y >> 1); } else { return gcd(y, x - y); } } } } // 判斷一個數是否為偶數 public static boolean isEven(int x) { // 只需要讓這個數與1相與即可,因為任何一個數,只要是偶數,那這個數的二進位制的第一位,必定是0 if ((x & 1) == 0) { return true; } else { return false; } }