剑指offer12_数值的整数次方_题解
数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
示例1
输入
2,3
返回值
8.00000
分析
方案一:快速幂(非递归)
对 \(a^b\) 来说,如果把 \(b\) 写成二进制,那么 \(b\) 就可以写成若干二次幂之和。例如 \(13\) 的二进制是 \(1101\),\(3\)号位、\(2\)号位、\(0\)号位就都是 \(1\),那么就可以得到 \(13=2^3+2^2+2^0=8+4+1\)
所以 \(a^{13}=a^{8+4+1}=a^8*a^4*a^1\)
任意的 \(a^b\) 可以表示为 \(a^{2k}、...、a^8、a^4、a^2、a^1\) 中若干项的乘积
思考:如果 \(b\) 为负数,如何求 \(a^b\)
比如求 \(x^{-2}\),可以转换为 \((1/x)^2\)
/**
时间复杂度:O(logn)
空间复杂度:O(logn)
**/
class Solution
{
public:
double Power(double base, int exponent)
{
// 如果exponent为负指数
if (exponent < 0)
{
base = 1 / base; //取底数的倒数
exponent = -exponent;
}
double ret = 1.0;
while (exponent > 0)
{
if (exponent & 1) //如果b的二进制末尾为1
{
ret = ret * base; //令ans累积上base
}
base = base * base; //令a平方
exponent >>= 1; //将b的二进制右移1位
}
return ret;
}
};
方案二:递归
①如果 \(b\) 是奇数,那么有 \(a^b=a*a^{b-1}\)
②如果 \(b\) 是偶数,那么有 \(a^b=a^{b/2}*a^{b/2}\)
class Solution
{
public:
// 递归
double binary_power(double b, int e)
{
if (e == 0)
{
return 1;
}
if (e & 1)//奇数
{
return b * binary_power(b, e - 1);
}
else//偶数
{
double mul = binary_power(b, e >> 1);
return mul * mul;
}
}
double Power(double b, int e)
{
if (e < 0)
{
b = 1 / b;
e = -e;
}
return binary_power(b, e);
}
};