題目描述
給定乙個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.效...