剑指12 数值的整数次方
一、题目描述
给定一个浮点数,求解他的整数次幂。
这道题可以使用递归的方法来降低计算复杂度,也可以使用位运算的方法来求解。
位运算不是很熟悉,所以主要探讨一下位运算来解决的方式(位运算也是迭代降低复杂度)。
二、位运算来解决
对于给定一个浮点数 x x x与一个整数 y y y。求解 x y x^y xy。y具有二进制表示 y ^ \hat y y^
那么对于 y ^ n , y ^ n − 1 , . . . . , y ^ 0 \hat y_n,\hat y_{n-1},....,\hat y_0 y^n,y^n−1,....,y^0组成的 y ^ \hat y y^。
最终的结果为 x 2 n y ^ n × . . . × x 2 0 y ^ 0 x^{2^{n}\hat y_n} \times ... \times x^{2^{0} \hat y_0} x2ny^n×...×x20y^0
可以观察到最终结果中的前一项为后一项的次方,那么可以利用这样的特点来减少计算,使得整体计算复杂度为 O ( l o g ( n ) ) O(log(n)) O(log(n))
三、代码
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# 获取 exponent 浮点类型
if(exponent == 0 ):
return 1
if(exponent == 1 ):
return base
expo = exponent if exponent >0 else -exponent
res = 1
while(expo & 0xffffffff != 0):
if(expo & 1 !=0):
res = res * base
expo = expo >> 1
base = base * base
return res if exponent >0 else 1/res
so = Solution()
res = so.Power(2,-1)
print(res)