1.暴力迴圈:o(n):超時,o(1)
先處理特殊輸入的情況,再處理指數和底數正常的情況;
class
solution}if
(x ==
1|| n ==0)
return1;
//1^n 或 x^0
//剩下是正常情況:x和n都非0
double res =
1.0;
long n1 = n;
if(n <
0) x =
1/ x;
for(
long i =
0; i <
abs(n1)
;++i)
return res;}}
;
2.快速冪:o(logn):每次指數右移一位,o(1)
①先處理底數和指數為0時的特殊情況;
②long n1 = n;//題目的n最小值取到 int32_min,下面解法的思路是先根據指數的正負,去調整x和n,目的是在下面統一以指數的絕對值作迴圈(因為只有正數才能使用快速冪,每次迴圈右移一位直至為0,才能正確退出迴圈),若用int存指數n,則abs(int32_min)會溢位為int32_min < 0,會導致算數右移補1從而導致無限迴圈;
class
solution}if
(x ==
1|| n ==0)
return1;
//1^n 或 x^0
//剩下是正常情況:x和n都非0
double res =
1.0;
long n1 = n;
//n取-2^31時,取反會溢位,因此需要用long來存
if(n <0)
while
(n1)
x *= x;
n1 >>=1;
//正數右移補0,負數右移補1
}return res;}}
;
劍指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...