一、题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
注:base和exponent不同时为0。
二、解题思路
当exponent>0时,本题的本质就是快速乘法。
当exponent<0时,
b
a
s
e
e
x
p
o
n
e
n
t
=
1
b
a
s
e
−
e
x
p
o
n
e
n
t
base^{exponent}={1\over{base^{-exponent}}}
baseexponent=base−exponent1,只需要使用快速乘法求解
b
a
s
e
−
e
x
p
o
n
e
n
t
base^{-exponent}
base−exponent,然后再取其倒数,即为最终的结果。
因此,本题的最终的本质还是快速乘法。
我们以求 1 0 11 10^{11} 1011为例,说明快速乘法的过程:
- 将指数11转换为二进制形式1011;
- 1 0 11 = 1 0 1 × 8 × 1 0 0 × 4 × 1 0 1 × 2 × 1 0 1 × 1 10^{11}=10^{1\times8}\times10^{0\times4}\times10^{1\times2}\times10^{1\times1} 1011=101×8×100×4×101×2×101×1。
在这个过程中,我们先求出 1 0 1 10^1 101,然后根据 1 0 1 10^1 101求出 1 0 2 10^2 102,再根据 1 0 2 10^2 102求出 1 0 4 10^4 104,…,最后求出 1 0 8 10^8 108。因此,11的二进制数形式总共多少位,就使用了几次乘法。
然后把应该累乘的值相乘即可,即 1 0 8 10^8 108、 1 0 2 10^2 102、 1 0 1 10^1 101应该累乘,因为8、2、1对应到11的二进制数中,相应位上是1;而 1 0 4 10^4 104不应该累乘,因为4对应到11的二进制数中,相应位上是0。
三、代码实现
代码实现使用python 2.7.3。
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
if base == 0:
return 0
elif exponent == 0:
return 1
else:
flag = exponent > 0
res = 1
exponent = abs(exponent)
while exponent:
if exponent & 1:
res *= base
base *= base
exponent >>= 1
if flag:
return res
else:
return 1/res