方法一:我自己的思路去写:
class Solution {
public:
double myPow(double x, int n) {
double result = 1;
if(x == 0)
{
return 0;
}
//如果幂为0 或者底数为1 返回为1
if( n == 0 || x == 1)
return 1;
if( x == -1)
{
n = n > 0 ? n : (-n);
if( n % 2 == 1)
return -1;
else
return 1;
}
if( n > 0)
{
int temp = n;
while( temp )
{
result = result * x;
temp--;
}
}
if( n < 0)
{
int temp = -n;
while( temp )
{
result = result * x;
temp--;
}
result = 1 / result;
}
return result;
}
};
后面就超时了:
方法二:快速幂函数递归实现
class Solution {
public:
double myPow(double base, int exponent) {
if( base == 0 )
return 0;
if( exponent == 0 || base == 1)
return 1;
long absExopnent = exponent;
absExopnent = absExopnent > 0 ? absExopnent : ( - absExopnent );
double result = PowerWithUnsignedExponent( base, absExopnent);
if( exponent < 0 )
{
return 1.0 / result;
}
return result;
}
private:
//对正数求平方
double PowerWithUnsignedExponent(double base, long absExopnent)
{
if( absExopnent == 0)
return 1;
if( absExopnent == 1)
return base;
//把a的n次方转换成a的n/2次方相乘
double result = PowerWithUnsignedExponent( base, absExopnent >> 1);
result *= result;
//当输入的数为奇数的时候,还要再乘以一个原来的数,这一步只有在递归返回的最后一步执行,
//比如5/2 = 2,除以2后都是偶数,只有返回到最开始输入的那个数也就是最后一次执行才会执行到这一句。
if(absExopnent & 0x1)
result = result * base;
return result;
}
};
if(n%2==1)可以改写成if(n & 1);判断一个数是奇数的按位与判断写法
优化后的代码
class Solution {
public:
double myPow(double base, long exponent) {
if( base == 0 )
return 0;
if( exponent == 0 || base == 1)
return 1;
long absExopnent = 0;
absExopnent = exponent > 0 ? exponent : ( - exponent );
double result = qmi( base, absExopnent);
if( exponent < 0 )
{
return 1.0 / result;
}
return result;
}
double qmi(double a, long b){
double res = 1;
while (b){
if (b & 1) res = res * a ;
b >>= 1;
a = a * a ;
}
return res ;
}
};