1. 程式人生 > >求最大公約數的高效率演算法

求最大公約數的高效率演算法

宣告:下文中的演算法與數學原理,都是從《程式設計之美》的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;
		}
	}