天天看點

@劍指offer(Python)數值的整數次方劍指offer刷題筆記12(Python)

劍指offer刷題筆記12(Python)

題目描述

給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。

思路1

偷懶……直接利用Python的内置函數pow()。

代碼1

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        return pow(base,exponent)
           

思路2

利用乘法,不過得考慮底數是否為0,以及指數與0的關系。當指數exponent為0時,任何數的0次方都是1;當exponent不等于0,但底數base為0時,0的任何次方都為0;當底數不為0,這時候要區分指數exponent與0的關系:當指數大于0,直接将底數base連乘exponent次就好;當指數小于0,将指數取相反數,換成正數,然後在連乘,最後将結果取倒數。

代碼2.1

-*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if base == 0:
            return 0
        flag = True        # 設定一個指數是否小于0的标志,預設為True,即指數為正數。
        if exponent < 0:
            exponent = -exponent
            flag = False
        result = 1
        for i in range(exponent):
            result *= base
        return result if flag else 1/result
           

這種方法能進行一下優化,利用遞歸:

@劍指offer(Python)數值的整數次方劍指offer刷題筆記12(Python)

代碼2.2

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if base == 0:
            return 0
        flag = True        # 設定一個指數是否小于0的标志,預設為True,即指數為正數。
        if exponent < 0:
            exponent = -exponent
            flag = False
        if exponent % 2 == 0:     # 判斷指數是否為偶數
            res = self.Power(base,exponent//2)
            res *= res
        else:
            res = self.Power(base,exponent//2)
            res *= res
            res *= base
        return res if flag else 1/res
           

思路3

利用快速幂,具體思路我在另一篇部落格裡進行了介紹:https://blog.csdn.net/ggdhs/article/details/90141960

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if base == 0:
            return 0
        flag = False
        if exponent<0:
            exponent = -exponent
            flag = True
        res = 1
        while exponent:
            if exponent & 1:   # 判斷目前的最後一位是否為1,如果為1的話,就需要把之前的幂乘到結果中。
                res *= base
            base *= base   # 一直累乘,如果最後一位不是1的話,就不用了把這個值乘到結果中
            exponent = exponent >> 1
        return res if not flag else 1/res