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