题目描述
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
解题思路
1、n >> 1
相当于n / 2
,右移运算符相当于除以2
2、(n & 1) == 1
相当于(n % 2) == 1
,用来判断一个数是否是奇数
3、这道题需要考虑到输入指数是零和负数的情况
//指数为负数的情况
if(n == -1)
return 1 / x;
4、从二分法角度解决问题
当n 为偶数的时候:
a
n
=
a
n
/
2
.
a
n
/
2
a^n = a^{n/2} . a^{n/2}
an=an/2.an/2
当n为奇数的时候:
a
n
=
a
(
n
−
1
)
/
2
.
a
(
n
−
1
)
/
2
.
a
a^n = a^{(n-1)/2} . a^{(n-1)/2}.a
an=a(n−1)/2.a(n−1)/2.a
代码
class Solution {
public double myPow(double x, int n) {
if(n == 0)
return 1;
if(n == 1)
return x;
if(n == -1)
return 1 / x;
double res = myPow(x, n >> 1);
res *= res;
if((n & 1) == 1)
res *= x;
return res;
}
}