西大的阳光下有大洋的影子

我不上网了

剑指offer——12数值的整数N次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0

思路:

简单版(暴力法):给定一个指数,循环和底数相乘得出结果。在该方法中,有个问题需要考虑,就是判断指数为正负的问题,当指数为负时,需要将求得的数除1即可。

class Solution:
    def Power(self, base, exponent):
        # write code here
        if base == 0:
            return 0
        if exponent==0:
            return 1
        result = 1
        for i in range(abs(exponent)):
            result*=base
        if exponent<0:
            return 1/result
        else:
            return result

  

改进版:可想而知,循环相乘做了很多无用功,比如在一个循环中需要做32次循环,我们的目标是求出该数的32次方,我们只需要求出该数的16次方再平方即可。相应的16次方可以有八次方平方得来。这样就省去了很大一部分计算。

 

 

class Solution:
    def Power(self, base, exponent):
        # write code here
        if base - 0 > -0.0000001 and base - 0 < 0.0000001 and exponent < 0:
            return 0
        if exponent >= 0:
            return self.powWithUnsignExponent(base, exponent)
        else:
            return 1 / self.powWithUnsignExponent(base, - exponent)

    def powWithUnsignExponent(self, base, absExpoent):
        if absExpoent == 0:
            return 1
        elif absExpoent == 1:
            return base
        result = self.powWithUnsignExponent(base, absExpoent >> 1)
        result *= result
        if absExpoent & 0x1 == 1:
            result *= base
        return result

  

 

posted on 2019-09-04 16:44  我不上网了  阅读(155)  评论(0编辑  收藏  举报

导航