劍指Offer面試題 16 數值的整數次方(細節)

2021-10-07 14:29:15 字數 1926 閱讀 6191

實現函式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

-100.0 < x < 100.0

−100.0

<

x<10

0.0n

nn 是 32

3232

位有符號整數,其數值範圍是 [−2

31,231

−1

][−2^, 2^ − 1]

[−231,

231−

1]。根據題目的給的樣例,可以知道如果指數為正數,直接迴圈相乘就行。如果是負數,那麼也當正數相乘,然後取倒數即可。

於是寫出下面的**:

class

solution

double result =1;

for(

int i =

1; i <= n ; i++)if

(flag)

return result;

}}

乍一看沒有問題,指數為正數負數的情況全考慮了。

但忽略了一點:當底數為0,指數為負數時,在第16行中就會執行1.0 / 0。這樣會導致執行時異常的發生,所以要對這一點做判斷。

所以當底數為0,指數為負數的情況下,丟擲異常或返回乙個特定值作為結果。

if

(x <

1e-7

&& x >

-1e-7

&& n <0)

這裡判斷乙個double型別數是否為0,不能直接寫x == 0,因為計算機中表示小數時都有誤差。所以設定乙個1e-7的誤差區間,只要在這個區間內(-0.0000001 ~ 0.0000001),就認為是0。

然而,還是通不過所有測試,因為n的值最高可達 2

312^

231 ,如果一次一次迴圈下去,肯定是超時的。所以可採用以下的思路,將時間複雜度由o(n

)o(n)

o(n)

,降為o(l

og(n

))

o(log(n))

o(log(

n))。

a n=

=\left\a^ \cdot a^ & n \ 為偶數 \\ a^ \cdot a^ \cdot a & n \text \end\right.

an= flag =

true

; n =

-n;}

double result =

mypow_1

(x, n);if

(flag)

return result;

}private

double

mypow_1

(double x,

int n)

double tmp =

mypow_1

(x, n /2)

;if((n &1)

==1)else

}}注意:這裡判斷 n 為奇偶使用的與運算,奇數的最低位肯定為1,偶數最低位肯定為0。

劍指offer 面試題16

include 思路 遍歷鍊錶過程中,將各個指標入棧,再出棧進行反轉 listnode reverselist listnode phead pnode pnodestack.top listnode pfront pnode pnodestack.pop while pnodestack.empt...

劍指Offer 面試題16 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。保證base和exponent不同時為0 題目比較簡單,但是需要全面考慮問題,主要是對冪次進行分類,1.exponent 0 這種情況只需要進行常規操作,無需特殊處理2.exponent 0...

劍指offer 面試題16 數值的整數次方

問題 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。輸入 double型浮點數base,int型整數exponent。輸出 double型結果。思路 本題思路不難,但是容易忘記處理各種邊界值,異常值。當exponent為正數時,base...