1、思路一:
根据n的取值分三种情况,n>0、n==0和n<0,用循环依次累计乘法。
class Solution {
public:
double myPow(double x, int n) {
double mul =1;
if(n==0){
return 1;
}
else if(n>0){
for(int i=0;i<n;i++)
mul *=x;
}
else{
for(int i=0;i>n;i--){
mul *= x;
}
mul = 1/mul;
}
return mul;
}
};
提交结果为Time Limit Exceeded
,
当x=0.00001,n=2147483647时超时。
2、思路二:
分治思想: x^n = x^(n/2) * x^(n/2) * x^(n%2),将x的n次方降幂为n/2,讨论n的奇偶性,如果n为奇数,则多乘一个v。
class Solution {
public:
double myPow(double x, int n) {
if(n==0) return 1;
else if(n<0) return 1.0/myPow(x,-n);
else {
double v=myPow(x,n/2);
if(n%2==0) return v*v;
else return v*v*x;
}
}
};
存在问题:x=1.00000,n=-2147483648时,显示Runtime Error。改为如下写法就可以顺利通过:
class Solution {
public:
double myPow(double x, int n) {
if(n<0) return 1.0/power(x,-n);
else return power(x,n);
}
private:
double power(double x,int n){
if(n==0) return 1;
double v=power(x,n/2);
if(n%2==0) return v*v;
else return v*v*x;
}
};