Implement pow(x, n).
第一感觉就是不能O(n),于是想了一个递归O(lgn)的办法,但是为了处理x和n的符号情况用了一个子函数。发现了一个int最小值问题,这里(http://bukkake.iteye.com/blog/712953)有详细的介绍。
如果int值是(-2147483648),int的最小值,则取符号相反的情况,在VS里面是不会有变化的。但是传到子函数就会出错。很奇怪leetcode上竟然有这个测试用例,并且有些没有考虑到这个的程序也会AC。
续:后来测试了一下发现,很难测试n(-2147483648)的情况,原因是任何数的这个次方基本上都是0或者 超出表示范围了。
精简版:
第一感觉就是不能O(n),于是想了一个递归O(lgn)的办法,但是为了处理x和n的符号情况用了一个子函数。发现了一个int最小值问题,这里(http://bukkake.iteye.com/blog/712953)有详细的介绍。
如果int值是(-2147483648),int的最小值,则取符号相反的情况,在VS里面是不会有变化的。但是传到子函数就会出错。很奇怪leetcode上竟然有这个测试用例,并且有些没有考虑到这个的程序也会AC。
续:后来测试了一下发现,很难测试n(-2147483648)的情况,原因是任何数的这个次方基本上都是0或者 超出表示范围了。
double pow(double x, int n)
{
long long index = n;
double result = 0;
int flag = 1;
if (x<0 && n%2!=0)
x = -x, flag = -1;
if (index < 0)
result = powI(x, -index);
else
result = powI(x, index);
if (index < 0) return 1/result*flag;
else return result*flag;
}
double powI(double x, long long n) // x>0, n>=0
{
if (n == 0) return 1;
else if (n == 1) return x;
else if (n == 2) return x*x;
else
{
if (n%2==0)
{
double mid = powI(x, n/2);
return mid*mid;
}
else {
double mid = powI(x, (n-1)/2);
return mid*mid*x;
}
}
}
精简版:
double pow(double x, int n)
{
if(n==0) return 1;
if(n==1) return x;
int exp = n<0?-n:n;
double result= exp%2==0?pow(x*x,exp/2):pow(x*x,exp/2)*x;
return n<0?1/result:result;
}