问题描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。Pow(X,n)
问题分析:
问题首先要考虑输入值的合法性,0的0次方可以返回1,可以视作是合法的;但0的负数次幂则是没有意义,因此需要单独挑出来;
此外,double类型数据的比较最好采用相减不大于某个极小值(比如0.00000001)来表示相等,最好不要使用==;
计算一个数的x的n次方,首先要考虑n是否为正数,当n为负数时,将n取为-n转化成正数,x取其倒数1/x(注意去除底数为0的情况,底数为0,n为正时,结果始终返回0);则原问题即转化为pow(1/x,-n)的情况,指数统一的划为正数;
计算幂时,采用x连乘n次的效率太低,可以考虑“二分法”;即:
代码:
递归解法:
public class Solution {
private final static double MAX_DIS = 0.000000001;
public double myPow(double x, int n) {
// 不合法情况:当底数为0,指数为负值时
if (isEqual(x, 0.00) && n < 0) return 0.00;
return power(x, n);
}
private double power(double x, int n) {
if (n == 0) return 1.0;
if (n < 0) {
n = -n; x = 1.0 / x;
}
double temp = power(x, n / 2);
return (n & 0x1) == 1 ? (temp * temp * x) : (temp * temp);
}
// 判断两个double类型的数值是否相同,不能仅仅使用==来判断
private boolean isEqual(double a, double b) {
return (Math.abs(a - b) < MAX_DIS);
}
}
非递归解法:
private double power(double x, int n) {
if (n < 0) {
n = -n; x = 1.0 / x;
}
double result = 1.0;
for (double base = x;n > 0; n >>= 1) {
if ((n & 0x1) == 1)
result *= base;
base *= base;
}
return result;
}