劍指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
這種方法能進行一下優化,利用遞歸:
代碼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