题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0.
解题思路:一种是常规的解题方法,一种是运用快速幂的方法求解。
常规的运算法有个很大的缺点,时间复杂度为O(n),例如3^999常规法要循环999次,显然这种方式不可取的,所以我们需要一种更高效的算法,来解决这个问题——快速幂运算。
class Solution {
public:
double Power(double base, int exponent)
{
if(exponent == 0)
return 1;
if(base == 0)
return 0;
int n = exponent;
if(exponent < 0)
n = -exponent;
int i;
double res = 1;
for(i=0; i<n; i++)
{
res = base*res;
}
return exponent > 0? res : 1/res;
}
};
下面这种就是快速幂运算法:
1.全面考察指数的正负、底数是否为零等情况。
2.写出指数的二进制表达,例如13表达为二进制1101。
3.举例:10^1101 = 10^0001*10^0100*10^1000。
4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
class Solution {
public:
double Power(double base, int exponent)
{
if(0 == base)
return 0;
if(0 == exponent)
return 1;
int n;
if(exponent < 0)
n = -exponent;
else
n = exponent;
double res = 1;
while(n)
{
if((n&1) == 1)
res = res*base;
base *= base;
n >>= 1;
}
return exponent > 0 ? res : 1/res;
}
};