劍指Offer16 數值的整數次方

2021-10-19 05:31:51 字數 997 閱讀 3347

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...