问题描述
实现 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/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−2^31, 2 ^31 − 1] 。
解题思路
求x的n次方,显然,利用for循环,每次让x相乘即可,但是本题有很多细节,如n为负时计算可以先求为取相反数后计算得到的倒数,但是当n=−2^31,直接取相反数会导致溢出,当n为负时,本题如果直接让x循环n次的话会造成超时,所以每次循环都可以判断结果是否趋近于0,如果趋近于0,就可以返回0。同时还有许多其它的情况也需要考虑到,具体见下面代码。
代码实现
class Solution {
public double myPow(double x, int n) {
//当x为1的时候(注意,浮点数不能直接等于),不管多少次放,都返回1
if((x>0.9999999)&(x<1.0000001)){
return x;
}
//当x为-1的时候
if((x>-1.000001)&&(x<-0.999999)){
if(n%2==0){
return (-x);
}else{
return x;
}
}
double result=x;
//任何数的0次方都为1
if(n==0){
return 1;
}else if(n<0){
//当n为-2的31次方
if(n==-2147483648){
//需要相乘2147483648次
for(int i=0;i<=2147483647;i++){
result=result*result;
double temp=(double)(1/result);
//当此时的乘积接近为0,就返回0
if((temp<0.000001)&&(temp>0)){
return 0.00000;
}
}
}else{
int m=-n; //取相反数,然后相乘。
for(int i=1;i<m;i++){
result=result*x;
double temp=(double)(1/result);
if((temp<0.000001)&&(temp>0)){
return 0.00000;
}
}
}
//最后取倒数
result=(double)(1/result);
}else{
for(int i=1;i<n;i++){
result=result*x;
}
}
return result;
}
}