- Pow(x, n)
Implement pow(x, n), which calculates x raised to the power n (i.e., xn).
1.思路来自于之前一道题,求xn,如果一个一个累加,会超时,题解思路是,对于x,第一次加x,第二次加x+x,然后加(x+x)+(x+x),计数器count<2n时,会继续累加,否则递归(x,n-count)
double mypow(double x,long long int n){
if(n==0){
return 1;
}
if(n==1){
return x;
}
int i=1,maxi=INT_MAX>>1;
double res=x;
while(i<=maxi&&2*i<=n){
res=res*res;
i=2*i;
}
return res*mypow(x,n-i);
}
double myPow(double x, int n) {
if(n==0){
return 1.0;
}
long long int m=n;
return m>0?mypow(x,m):(1/mypow(x,-m));
}
2.本题的官方题解递归思路:递归处理n,n是偶数,返回xn/2 *xn/2;n
是奇数,返回xn/2 *xn/2*x
double mypow(double x,long long int n){
if(n==0){
return 1.0;
}
double y=mypow(x,n/2);
if((n&1)==1){
return y*y*x;
}else{
return y*y;
}
}
double myPow(double x, int n) {
if(n==0){
return 1.0;
}
if(n==1){
return x;
}
long long int m=n;
return m>0?mypow(x,m):(1/mypow(x,-m));
}
3,官方迭代题解
double myPow(double x, int n) {
if(n==0){
return 1.0;
}
if(n==1){
return x;
}
long long int m=n;
bool flag=true;
if(m<0){
m=-m;
flag=false;
}
double res=1;
double cur=x;
while(m!=0){
int temp=m&1;
if(temp==1){
res=res*cur;
}
cur=cur*cur;
m=m/2;
}
return flag?res:(1/res);
}