1.题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
2.算法描述
如果直接累乘时间复杂度是 O ( n ) O(n) O(n),调用库函数即可。
讨论下快速幂(时间复杂度为 O ( l o g n ) O(logn) O(logn))是如何解答的。
假如我们需要求的是50的11次方。快速幂是这样计算的。
1.首先,
1
1
10
=
101
1
2
11_{10} = 1011_{2}
1110=10112
2.那么,
5
0
1
1
10
=
5
0
101
1
2
50^{11_{10}}=50^{1011_{2}}
501110=5010112
3.最后快速幂这样计算:
5
0
1011
=
5
0
0001
∗
5
0
0010
∗
5
0
0000
∗
5
0
1000
50^{1011} = 50^{0001}*50^{0010}*50^{0000}*50^{1000}
501011=500001∗500010∗500000∗501000,分别是
5
0
1
,
5
0
2
,
5
0
4
,
5
0
8
,
.
.
.
50^1,50^2,50^4,50^8,...
501,502,504,508,...,而计算这些数的时候,当前的数只需要将之前的数平方即可。所以对指数进行从右到左的扫描,如果对应位置上是1,就把这个被乘数乘到结果中去。然后检查下一位,直到指数为0。
这个题目分三种情况处理:
a)指数大于0。直接运用快速幂计算。
b)指数小于0。如果底数为0,返回错误;如果底数不为0,将指数转为正数,然后运用快速幂计算。返回结果的倒数。
c)指数等于0。返回1。
3.代码描述
3.1.Java代码
public class Solution {
public double Power(double base, int exponent) {
int exp = 0;
double ans = 1;
if(exponent>0)
exp = exponent;
else if(exponent<0){
if(base==0)
throw new RuntimeException("分母不能为0");
else
exp = -exponent;
}
else
return 1;
while(exp!=0){
if((exp&1)==1)
ans *= base;
base *= base;
exp >>= 1;
}
return exponent>0 ? ans : 1/ans;
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
exp = 0
ans = 1
if exponent>0:
exp = exponent
elif exponent<0:
if base==0:
return None
else:
exp = -exponent
else:
return 1
while exp:
if (exp&1) == 1:
ans *= base
base *= base
exp >>=1
return ans if exponent>0 else 1/ans