实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2 的 -2 次方等于 1/4
说明:假设 x 和 n 都在计算机合法表示范围内
package com.loo;
public class PowerXN {
/**
* @param args
*/
public static void main(String[] args) {
double x = 2;
int n = 9;
System.out.println(getPowerXN1(x , n));
System.out.println(getPowerXN2(x , n));
}
// 把上一次的结果进行平方后,注意判断当 n 为奇数时还需要额外乘一个 x 。
public static double powerXN1(double x , int n) {
if (n == 0) {
return 1.0;
}
double value = powerXN1(x , n/2);
return ((n & 1) == 0) ? value * value : value * value * x;
}
public static double getPowerXN1(double x , int n) {
return n> 0 ? powerXN1(x , n) : 1.0/powerXN1(x , -n);
}
// 把 n 转化为二进制位,对应每个二进制位做相应乘积
public static double powerXN2(double x , int n) {
double result = 1.0;
double x_power = x;
while (n>0) {
if ((n & 1) == 1) { // 等价于 n %2 == 1
result *= x_power;
}
n = n >> 1; // 等价与 n /= 2
if (n > 0) { // 规避最后一次不符合条件了还计算一次 x_power *= x_power
x_power *= x_power;
}
}
return result;
}
public static double getPowerXN2(double x , int n) {
return n>= 0 ? powerXN2(x , n) : 1.0/powerXN2(x , -n);
}
}