您的位置:首页 > Web前端

leetcode-50 Pow(x, n) 剑指Offer题11 数值的整数次方

2015-11-04 22:51 471 查看
问题描述:

给定一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: