思路一:
想必正常人的思路都是这样的吧:
特殊的底数0特殊处理,指数是0特殊处理
求出底数的指数绝对值的结果,然后如果指数是负数,求倒数,否则直接返回
代码如下所示:
class Solution {
public:
double myPow(double x, int n) {
if(x==0) return 1;
if(n==0) return 1;
long ex=n;
if(n<0) ex=-n;
double result=powWithUnsignedExponent(x,ex);
if(n<0) return 1.0/result;
return result;
}
double powWithUnsignedExponent(double x,long n)
{
double result=1;
for(int i=1;i<=n;++i)
{
result*=x;
}
return result;
}
};
然后卡了。。。
结果如下所示:
说实话,我不大懂为什么超出时间限制了。。。如果有大佬可以帮我解释再好不过了~
思路二:
快速幂好家伙,这是第一次接触,思路挺巧妙的,原理是利用下面这个数学式:
那有的人会说了,这个我也会。但是不是谁都能利用这个写出代码,下面是递归和迭代两种方式的实现:
递归
class Solution {
public:
double myPow(double x, int n) {
if(n==0) return 1;
if(n==1) return x;
if(n==-1) return 1/x;
double result=myPow(x,n>>1);
result*=result;
if(n&1) return result*x;
return result;
}
};
结果如下所示:
迭代
这个代码可以用一个位的理解来看,具体可以参考力扣
class Solution {
public:
double myPow(double x, int n) {
double res=1;
double base=x;
bool flag=(n>=0);
if(!flag) n=-(++n);
while(n>0)
{
if(n&1) res*=x;
x*=x;
n>>=1;
}
return flag ? res : 1/(res*base);
}
};
结果如下所示: