計算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;
}
