1. 程式人生 > >冪的運算:X的n次冪

冪的運算:X的n次冪

計算X的n次冪,有多種演算法

例子:計算2的62次方。

method 1 :time = 1527 納秒。

常規思路,進行61次的乘法!

private static long mi(long X, long n) {
		long start = System.nanoTime();
		long result = 1;
		for (long k = 0; k < n; k++) {
			result *= X;
		}
		System.out.println(System.nanoTime()-start);
		return result;
	}

 

method 2 :time = 113 納秒

進行拆分:2^62 = (2^31)^2 = (2^31)*(2^31)         // 得到 2^31 的值的情況下,需要 1 次乘法

     2^31 = (2^15)^2*2 = (2^15)*(2^15)*2   //  得到 2^15 的值的情況下,需要 2 次乘法

       2^15 = (2^7)^2*2 = (2^7)*(2^7)*2       //  得到 2^7 的值的情況下,需要 2 次乘法

       2^7 = (2^3)^2*2 = (2^3)*(2^3)*2        //  得到2^3 的值的情況下,需要 2 次乘法 

     2^3 = 2*2*2                //  …………………………,需要2次乘法

所以:該方法需   2+2+2+2+1 = 9 次乘法!

     /**
	 * 求x的n次方的值。
	 * 冪函式:
	 * x的n次冪
	 * @param x
	 * @param n
	 * @return
	 */
	public static long pow(long x, long n) {

		long start = System.nanoTime();
		if (n == 0) {
			System.out.println(System.nanoTime()-start);
			return 1;
		}
		// 如果是偶數
		if (isEven(n)) {
			return pow(x * x, n / 2);
		} else {
			return pow(x * x, n / 2) * x;
		}
	}

	/**
	 * 判斷x是否是偶數
	 *
	 * @param x
	 * @return
	 */
	private static Boolean isEven(long x) {
		if (x % 2 == 0) {
			return true;
		}
		if (x % 2 == 1) {
			return false;
		}
		return false;
	}