这道题考察的是递归算法。
具体解题方法参考剑指offer 16.
P.S.
- 需要注意对错误代码的三种判断方法。
- 在检验代码时,n如果是-2147483648的话,对其取复数会超过内存(溢出),所以需要先将其转化为unsigned,然后再取负,在对unsigned取负会求其补码,因此不会溢出。
- 需要注意double字符最后有0.0000位
时间和内存消耗以及源代码如下:
bool InvalidInput = false;
double myPowunsignedexponent(double x, unsigned int absexponent)
{
if (x == 0)
{
return 0;
}
if (absexponent == 0)
{
return 1;
}
double resultunsignedexp = myPowunsignedexponent(x, absexponent>>1);
resultunsignedexp *= resultunsignedexp;
if (absexponent&1)
{
resultunsignedexp *= x;
}
return resultunsignedexp;
}
double myPow(double x, int n){
if (x==0.00000 && n<0)
{
InvalidInput = true;
return 1.00000/0.00000;
}
//这里n如果是-2147483648的话,对其取复数会超过内存(溢出),所以需要先将其转化为unsigned,然后再取负,在对unsigned取负会求其补码,因此不会溢出。
unsigned int absexponent = (unsigned int)(n);
if (n<0)
{
absexponent = -1 * absexponent;
}
double result = myPowunsignedexponent(x, absexponent);
if (n<0)
{
return 1.00000 / result;
}
return result;
}