1.题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
2.具体算法
- 递归快速幂算法
class Solution {
public:
double Power(double base, int exponent) {
if(exponent<0)
{
base = 1/base;
exponent = -exponent;//通过取倒数,保证指数的值是大于0的
}
while(exponent)
{
if(exponent%2==0)//判断exponent的奇偶性
return Power(base, exponent>>1)*Power(base, exponent>>1);//exponent为偶数时的返回值
else{
return base*Power(base, exponent>>1)*Power(base, exponent>>1);//exponent为奇数时的返回值
}
}
return 1.0;//exponent为0时的返回值
}
};
该算法的关键就是对exponent的奇偶性进行讨论,
例如:
exponent为5,base的值为3,那么35可以表示为:32 * 32 *3(exponent/2 = 2)
exponent为4,base的值为3,那么34可以表示为:32 * 32 (exponent/2 = 2)
- 非递归快速幂算法
class Solution {
public:
double Power(double base, int exponent) {
if(exponent<0)
{
base = 1/base;
exponent = -exponent;//通过取倒数,保证指数的值是大于0的
}
double x = base;
double ref = 1.0;
while(exponent)
{
if(exponent&1)
ref = ref*x;//当位数为1时就把x的值乘进去
exponent>>=1;//二进制左移,为遍历所有的位
x*=x;
}
return ref;
}
};
假设求x6 ,已知6可以表示成二进制110
可以表示成 6 = 0 * 20+1 * 21+1 * 22,所以 x6可以表示成x6 = x0 * x2 * x4 所以,对于二进制数,遇到位数是1的就乘到答案中。