思路:首先,使用循环乘法的方式肯定太慢了。可以使用二分的思路大大缩短运算成本。
需要考虑x==0,n<0的情况,可以选择递归的方法与循环的方法
递归的方法:
如果一个数的指数是偶数,那么二分的之后,就是两个数相乘。
如果它的指数是奇数,则两个数相乘后还要乘上x。
class Solution {
public double myPow(double x, int n) {
//搞一个递归回溯运算更快
// 8 -- 4 4
// 9 -- 4 4 1
//10 -- 5 5
//11 -- 5 5 1
long b = n;
if(b<0){
b=-b;
x=1/x;
}
return poww(x,b);
}
public double poww(double x,long n){
if(n==1){
return x;
}
if(n==0){
return 1;
}
double b =poww(x,n>>1);
return ((n&1)==0)? (b*b) :(b*b*x) ;
}
}
循环的方法:更加简单
通过减小指数,增大基数来循环。如指数为奇数,则在res上多乘一个底数。使用二分法,最终指数总会等于1,此时所有的数都乘在了res上。下次二分指数为0,跳出循环输出res。
class Solution {
public double myPow(double x, int n) {
if(x == 0) return 0;
long b = n;
double res = 1.0;
if(b < 0) {
x = 1 / x;
b = -b;
}
while(b > 0) {
if((b & 1) == 1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
}