剑指Offer编程题-数值的整数次方
题目:数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
假设求a^n,一般的想法是用循环将a乘n次,这样的时间复杂度是O(n),但是使用快速幂的方法可以将复杂度降到O(log2(n))。
快速幂:假设n=13,我们求a^13,n的二进制表示为1101,即2^3 + 2^2 +2^1,那么a^13 = a^(2^3 + 2^2 +2^1) = a^(2^3)*a^(2^2)*a^(2^1)。通过>>移位以及&1运算可以用来判断二进制每一位是否为1,我们先初始化一个变量m = 1,用来保存结果,在判断n的二进制位为1时,m *= a,然后n右移一位并且a *= a直到n为0。
除了移位,也可以根据10进制转2进制的原理,通过对2求余来迭代,并判断余数是否为1
实现
python
方法1:
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
e = 1
a = 1
if exponent < 0:
exponent = -exponent
e = -1
while exponent:
if exponent&1:
a *= base
base *= base
exponent >>= 1
return a if e>0 else 1/a
python
方法2:
class Solution:
def Power(self, base, exponent):
# write code here
e = 1
a = 1
if exponent < 0:
exponent = -exponent
e = -1
while exponent:
if exponent%2:
a *= base
base *= base
exponent = int(exponent/2)
return a if e>0 else 1/a