求一个数的n次方。
n给的是int类型的,但是其实n取到-2147483648时,程序会出现问题,不知道为什么。只有特殊处理了。
采用二分的方法对n进行处理,这样的话迭代会很快。O(logn)的时间复杂度。
class Solution {
public:
double myPow(double x, int n) {
//double sum=1;
if(x==1.0)return x;
if(x==-1.0&&(n%2==0))return -1*x;
else if(x==-1.0&&((n%2+2)%2==1))return x;
if(n>0){return binary(x,n);}
else if(n<0){n*=-1;return 1/binary(x,n);}
else return 1;
}
double binary(double sum,int nn){
if(nn==1)return sum;
if(nn%2)return binary(sum*sum,nn>>1)*sum;
else return binary(sum*sum,nn>>1);
}
};
刚刚试验下,原来是由于int的范围为-2147483648到-2147483647,当n为-2147483648时,我会将它转化为正数,这样的话,会超出int的范围,导致溢出。
class Solution {
public:
double myPow(double x, int n) {
//double sum=1;
//if(x==1.0)return x;
if(n>0){return binary(x,n);}
else if(n<0){if(n==-2147483648){n/=2;x*=x;}n*=-1;return 1/binary(x,n);}
else return 1;
}
double binary(double sum,int nn){
if(nn==1)return sum;
if(nn%2)return binary(sum*sum,nn>>1)*sum;
else return binary(sum*sum,nn>>1);
}
};