问题描述:
给定一个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; }