题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
解法
解法一:使用库函数
使用pow()函数可直接求得答案,自己编写完整程序时应注意要包含#include <math.h>
代码:
class Solution {
public:
double Power(double base, int exponent)
{
return pow(base,exponent);
}
};
解法二:暴力迭代
这里需要注意的点就是要考虑指数为负数的情况。时间复杂度为O(n)。
代码:
class Solution {
public:
double Power(double base, int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
double x=base;
bool isNegative=(exponent<0);
exponent=abs(exponent);
for(int i=1;i<exponent;i++)
x*=base;
return isNegative?1/x:x;
}
};
解法三:递归求解
为了方便讨论,假设指数exponent是正数。那么递归式如下:
1、如果exponent是偶数,Power(base, exponent) = Power(base, exponent / 2) ×Power(base, exponent / 2)
如果exponent是奇数,Power(base, exponent) = base *
2、Power(base, exponent / 2) ×Power(base, exponent / 2)
对于负指数exponent的情况,取其绝对值先计算。将最后结果取倒数即可。
代码:
class Solution {
public:
double Power(double base, int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
double s;
bool isNegative=(exponent<0);
exponent=abs(exponent);
s=Power(base,exponent/2);
if(exponent%2==0)
s=s*s;
else
s=s*s*base;
return isNegative?1/s:s;
}
};
解法四:快速幂算法
没写过快速幂,今天完整的写一下。
快速幂原理:
以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为 2^i-1
例如
11的二进制是1011
因此,我们将a¹¹转化为算
代码:
class Solution {
public:
double Power(double base, int exponent)
{
bool isNegative=(exponent<0);
exponent=abs(exponent);
double x=1;
while(exponent>0)
{
if((exponent&1)==1)
x*=base;
base=base*base;
exponent>>=1;
}
return isNegative?1/x:x;
}
};
解法四:递归版本的快速幂算法
class Solution {
public:
double Power(double base, int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
bool isNegative=(exponent<0);
exponent=abs(exponent);
double x;
x=Power(base, exponent>>1);
x=x*x;
if(exponent&1==1)
x*=base;
return isNegative?1/x:x;
}
};