问题描述
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解题报告
求解
x
n
x^n
xn时:
如果n
是奇数,则
x
n
=
x
(
n
/
2
)
⋅
2
⋅
x
x^n=x^{(n/2)\cdot2}\cdot x
xn=x(n/2)⋅2⋅x
如果n
是偶数,则
x
n
=
x
(
n
/
2
)
⋅
2
x^n=x^{(n/2)\cdot2}
xn=x(n/2)⋅2
一直这样迭代下去。
这样做的原因是减少乘法的计算次数。
因为 n
可正可负,所以当n为负数时,将其取反,但是因为32位有符号整数的取值范围是[
−
2
31
,
2
31
−
1
-2^{31},2^{31}-1
−231,231−1]
所以当n
取值 -2147483648
[32位有符号整数的最小数]时,需要单独进行处理。
实现代码
class Solution {
public:
double myPow(double x, int n) {
double ans;
bool flag=true;
if(n==0) return 1.0;
if(n==-2147483648){
ans=myPow(x, 1073741824);
return 1.0/(ans*ans);
}
if(n<0){
flag=false;
n=-n;
}
if(n%2==0){
ans=myPow(x,n/2);
return flag?ans*ans:1.0/(ans*ans);
}
else{
ans= myPow(x,n/2);
return flag?ans*ans*x:1.0/(ans*ans*x);
}
}
};