給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
思路:
有兩種方法來解決這個問題:
1、第一種是暴力方法,就是用for迴圈,乙個迴圈base乘一遍,這樣就會得到結果,需要判斷exponent是否為負數,如果為負數,那麼求得的結果需要去倒數。
2、第二種方法是對第一種方法進行了優化,其思路是數學上的乙個定理,可以簡化運算,減少迭代次數,定理如下:
也就是說原本用for迴圈的問題可以通過計算一次然後兩個計算結果相乘,用遞迴來解決問題,遞迴的突破條件是exponent為1的情況,最開始exponent為0的情況在第一次判斷exponent是否為0時被使用。另外exponent右移一位:exponent>>1代表exponent除2。
牛客網的code貌似對base為0的情況沒有考慮,不做base為0情況檢查也能通過,我覺得這樣並不嚴謹,還是加上比較好,方法二其實可以寫成兩個函式,這樣能使判斷更少、**更優,原諒我很懶,沒有優化**,不過思路還是可以參考的。
solution:
python
(1)# -*- coding:utf-8 -*-
class solution:
def power(self, base, exponent):
# write code here
if base == 0:
return 0
if exponent == 0:
return 1
elif exponent == 1:
return base
else:
flag = exponent/abs(exponent) #exponent符號標誌位
tmp = 1
for i in range(abs(exponent)):
tmp = tmp *base
if flag > 0:
return tmp
else: #exponent為負時,返回其倒數
return 1/tmp
(2)# -*- coding:utf-8 -*-
class solution:
def power(self, base, exponent):
# write code here
if base == 0:
return 0
if exponent == 0:
return 1
elif exponent == 1:
return base
else:
flag = exponent/abs(exponent)
result = self.power(base,abs(exponent)>>1)
if exponent % 2 == 0: #偶數
result = result*result
else: #奇數
result = result*result*base
if flag > 0:
return result
else:
return 1/result
劍指Offer (12)數值的整數次方
題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。實現如下 方法一 迴圈 此題不需要考慮計算後值溢位的情況,即不存在大數情況 異常情況 底數為0時 0.0 指數為0時 1.0 數學定義 指數為負數時,需要考慮先計算指數絕對值的結果...
劍指offer 12 數值的整數次方
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。1 對數字的預處理,比如,0的負數次方等 2 提高計算n的m次方的效率方法一 遞迴。利用公式 ab b 2 0 ab 2 ab 2 a b 1 2 a b 1 2 aclass soluti...
劍指Offer 12 數值的整數次方
description給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。用divide conquer的思路可以每次平方,最後堆起來得到答案。最開始的時候我搞不太清exp 0,1這種情況怎麼合併,所以就單獨分了出來。c double pow...