劍指Offer 數值的整數次方

2021-10-12 20:12:10 字數 2302 閱讀 2462

題目描述

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

保證base和exponent不同時為0

解法1最直接的思路,計算base的exponent次方,則將base連乘exponent次即可,時間複雜度為o(exponent)

但是要注意處理特殊情況:

如果底數base等於0則直接返回0

非0數的0次方等於1

當指數為負數時的結果,相當於用1除以指數為正數時的結果

還有乙個坑需要注意,下面的**中使用了long y = exponent;,需要將exponent轉換為long型別

是因為exponent可以等於-2147483648(int型別的最小值),如果直接進行-exponent操作,由於int型別的最大值是2147483647,則會導致越界,出現錯誤的結果

實現**

public

double

power

(double thebase,

int exponent)

double ret =1;

for(

double i =

0; i < y; i ++

)return ret;

}

解法2

可以根據二分的思路,利用遞迴每次求指數的一半的次方結果,然後再將遞迴的結果相乘得到完整的指數次方

由於求指數的一半,即整數除以2的結果會自動向下取整,所以需要特殊處理指數為奇數時的情況,當指數為奇數時,需要在遞迴結果相乘的基礎上再乘以一次底數

**中使用的位運算e >> 1相當於e / 2來計算指數的一半

**中通過位運算(e & 1) == 1 來判斷指數是奇數還是偶數(奇數的二進位制表示最低位一定是1,偶數的二進位制表示最低位一定是0),相當於(e % 2) == 1

使用位運算會有更快的執行效率

實現**

public

double

power2

(double thebase,

int exponent)

if(e ==1)

return thebase;

double ret =

power2

(thebase,

(int

)(e >

>1)

);return

(e &1)

==1? thebase * ret * ret : ret * ret;

}

解法3

求解整數m的n次方,一般是mn = m * m * m …,連乘n次,演算法複雜度是o(n),這樣的演算法效率太低,我們可以通過減少相乘的次數來提高演算法效率,即快速冪

對於n我們可以用二進位制表示,以14為例,14 = 1110

m14=m1110=m23∗1+22∗1+21∗1+20∗1=m23∗1∗m22∗1∗m21∗1∗m20∗0

=m8∗m4∗m2∗m0=m8∗m4∗m2∗1

可以發現這樣的規律,指數n的二進位制從低位到高位依次對應底數m的1次方,2次方,4次方,8次方…,當該二進位制位是1的時候,則乘以底數對應的次方數,如果該二進位制位是0,則不能乘以底數對應的次方數,即乘以1。

例如,m8對應的二進位制位是1,所以最終結果中有m8

m1對應的二進位制位是0,所以最終結果中只有m0,即1

使用快速冪後,原本需要的14次連乘,現在只需要4次連乘。

那麼怎樣得到乙個整數的二進位制位呢,又怎樣判斷該二進位制位是0還是1呢

可以使用與運算和右移運算,例如對於14 = 1110

和1按位與得到0,即第乙個二進位制位是0

1110右移一位,得到0111,和1按位與得到1,即第二個二進位制位是1

0111右移一位,得到0011,和1按位與得到1,即第三個二進位制位是1

0011右移一位,得到0001,和1按位與得到1,即第四個二進位制位是1

0001右移一位,得到0000,等於0則,演算法結束

實現**

public

double

power3

(double thebase,

int exponent)

double ret =1;

while

(y >0)

thebase *

= thebase;

y >

>=1;

}return ret;

}

更多演算法題目的完整描述,ac**,以及解題vb.net教程思路可以c#教程檢視github倉庫algorithm

劍指offer 數值的整數次方

1 題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。2 思路 需要考慮到的情況 1 指數為負數的時候,可以先對指數求絕對值,算出次方之後的結果再取倒數。2 當底數是0,指數是負數的時候,可以將無效變數設定為true,並返回0。3...

劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。將指數大於0,小於0,等於0 底數不為0 的情況分開。其實指數為0的情況不必單獨拎出來 不進入if直接返回result為1.0 真正需要考慮的是,底數為0而指數為負的情況,數學上沒有意義。書...

劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。1.最直觀的方法,遞迴求解a b a a b 1 當然也可以用迴圈實現。要注意特殊情況,指數為0時乘方結果都是1 指數為負數時的計算,可以先轉化為正數再求倒數,但是底數為0時不能求導。2.效...