劍指 Offer 16 數值的整數次方

2021-10-14 07:09:09 字數 1380 閱讀 6035

實現函式double power(double base, int exponent),求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。

示例 1:

輸入: 2.00000, 10

輸出: 1024.00000

示例 2:

輸入: 2.10000, 3

輸出: 9.26100

示例 3:

輸入: 2.00000, -2

輸出: 0.25000

解釋: 2-2 = 1/22 = 1/4 = 0.25

說明:-100.0 < x < 100.0

n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。

注意:本題與主站 50 題相同:

class

solution

}else

if(n<0)

}else

if(n==0)

return pow;

}}

然而超出了時間限制。。。。

遞迴–自頂向下方法

既然自底向上不行,那自頂向下試試。

想到a的n次方有乙個公式:

an=a(n/2)a^(n/2)—n為偶數

** an=a*a(n/2)a^(n/2)—n為奇數

遞迴時可以減少運算次數;

同時考慮到n>>1數學等價於n/2,並且位操作比除法操作效率高,所以用位操作代替除2;

class

solution

return

(n%2==0

)?mypow

(x*x,n>>1)

:x*mypow

(x*x,

(n-1

)>>1)

;// if(n>0)else

}}

或者:

class

solution

//遞迴方式的快速冪

public

double

power

(double x,

int n)

double r =

power

(x, n /2)

;//n&1判斷n最低為是否為1,為1則n為奇數,為0則n為偶數(其實就是n%2)

//指數n為奇數,則需要多乘乙個底數。因為上行**計算n/2時,若n為奇數,精度丟失向下取整(相當於少乘乙個x)if(

(n &1)

==1)else

}}

劍指Offer 16 數值的整數次方

實現函式double power double base,int exponent 求base的exponent次方,不得使用庫函式。同時不需要考慮大數問題。看到乘方,自然想到二分加速的方法。但是這個題關注的不是速度,而是考慮問題的全面性。比如幾個邊界情況,base 0,exp 0 的時候。時間複雜...

劍指offer16 數值的整數次方

題目 實現函式double power double base,int exponent 求base的exponent次方,不得使用庫函式,同時不需要考慮大數問題。一 第一種方法大體分為以下四種情況 1 底數為0,則返回0 2 底數不為0,若指數為0,則返回1 3 底數不為0,若指數為正數,呼叫po...

劍指offer 16 數值的整數次方

保證base和exponent不同時為0 分析 注意考慮特殊情況,當底數為0,如果指數是正整數,則可以返回1,如果底數為0,指數是負整數,那麼就會出錯,而且如果底數不是0,指數是負整數,則返回的應該是底數和正整數運算結果的倒數。因此要考慮齊全。double powerwithunsignedexpo...