剑指offer:数值的整数次方
题目:
实现函数 double Power(double base, int exponent),求base的exponent次方。
不使用库函数,不需要考虑大数问题。
思路:
简单的一次次相乘,效率太低,可以采用二分的想法。对于一个exponent,可以分解成 2的幂次相加的形式。这种分解恰好对应了这个exponent的二进制形式。如图:
如exponent 等于10 时。
10 = 1 × 2^3 + 0 × 2^2 + 1 × 2^1 + 0 × 2^0。
而我们知道 base^{2^n} =base^{ 2^{n-1}} ×base^{ 2^{n-1}},所以可以达到O(logn)的时间复杂度。
实现:
牛客网编程通过:
class Solution {
public:
double Power(double base, int exponent) {
if (base == 0) return 0;
if (exponent == 1) return base;
int exponent_plus = exponent > 0 ? exponent : -exponent;
int index;
double temp = base; //记录base^{2^i}的值
double value = 1;
while(exponent_plus)
{
index = exponent_plus & 0x1; //当前位的index:0 或 1
exponent_plus = exponent_plus >> 1;
if (index == 1) value = value * temp;
temp = temp * temp;
}
return exponent > 0 ? value : 1 / value;
}
};
注:exponent & 0x1的其实是exponent % 2的意思, exponent >> 1是 exponent /= 2的意思。
采用位运算程序的效率会更高一些。