题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
- 这道题目,指明了指数exponent是一个int型的整数,这里就要考虑指数exponent是正还是负。另外,这种幂运算还有一个特殊的法则,如果指数是0,那么结果为1。这些都要考虑进去。
- 如果用一个循环,直接让数相乘exponent次,这种做法通常是不可取的,一般都会运行超时。至少在leetcode中是这样的,而且,这种确实不是合理的做法。
思路: 采用二分法的思想来实现。
举例说明:如果要求 x 10 x^{10} x10,那么只需要求出 x 5 x^{5} x5,然后 x 5 ∗ x 5 x^{5}*x^{5} x5∗x5,依次类推,这样可以优化时间复杂度。采用这种方法,时间复杂度为O(logN)。
如果exponent是偶数,那么 r e s u l t = x e x p o n e n t / 2 ∗ x e x p o n e t / 2 result=x^{exponent/2}*x^{exponet/2} result=xexponent/2∗xexponet/2。
如果exponent是奇数,那么 r e s u l t = x e x p o n e n t / 2 ∗ x e x p o n e t / 2 ∗ x result=x^{exponent/2}*x^{exponet/2}*x result=xexponent/2∗xexponet/2∗x
注:
下面的程序虽然通过了,但是仍然漏考虑了情况。自己没有考虑到,当base为0.0,而exponent为负数的情况。此时 1/base,直接就会导致出问题。这一点是需要考虑的。
解答
class Solution {
public:
double Power(double base, int exponent) {
if(exponent==0)
{
return 1;
}
if(exponent<0)
{
return Power(1/base,-1*exponent);
}
//注意,下面如果写为
//return Power(base,exponent/2)*Power(base,exponent/2);
//那对优化时间没有任何意义
if(exponent%2==0)
{
double temp=Power(base,exponent/2);
return temp*temp;
}
else
{
double temp=Power(base,exponent/2);
return temp*temp*base;
}
}
};