实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
思路:快速幂
当exponent是0的时候,直接返回1即可,
当exponent小于0的时候,需要把它转化为正数才能更方便计算,同时base要变为1/base。
当exponent大于0的时候要分为两种情况,一种是偶数,一种是奇数。
1, 如果exponent是偶数我们只需要计算
Power(base*base, exponent/2)。比如我们要计算Power(3,8),可以改为Power(9,4)。
2, 如果exponent是奇数,我们只需要计算
base*Power(base*base, exponent/2),比如Power(3,9),可以改为3*Power(9,4)。
由于int32范围 n = -n 可能会出现溢出,所以用long来保存
class Solution {
public double myPow(double x, int n) {
if(n == 0) return 1.0;
double res = 1;
long ln = n;
if(ln < 0){
x = 1 / x;
ln = -ln;
}
while(ln > 0){
if((ln & 1) == 1) {
res *= x;
}
ln >>= 1;
x *= x;
}
return res;
}
}