劍指offer16 數值的整數次方

2021-09-27 13:32:42 字數 1472 閱讀 1687

題目:實現函式double power(double base,int exponent),求base的exponent次方,不得使用庫函式,同時不需要考慮大數問題。

一、第一種方法大體分為以下四種情況:

(1)底數為0,則返回0;

(2)底數不為0,若指數為0,則返回1;

(3)底數不為0,若指數為正數,呼叫powerresult函式計算結果;

(4)底數不為0,若指數為負數,取指數的絕對值,呼叫powerresult函式計算結果,將此結果取倒數。

具體**如下所示:

#include double powerresult(double base,int exponent)

return result;

}double power(double base,int exponent)

else //底數不為0

else if(exponent > 0) //指數為正數

else //指數為負數

}return result;

}int main()

執行結果如下:

二、第二種方法

採用遞迴的思路,例如求乙個數的32次方,如果已經知道了它的16次方,那麼只要在16次方的基礎上在平方一次可以了,而16次方是8次方的平方,這樣以此類推,求32次方只需要做5次乘法:先求平方,在平方的基礎上求4次方,在4次方的基礎上求8次方,在8次方的基礎上求16次方,最後在16次方的基礎上求32次方。

可用如下公式求a的n次方:

具體**如下所示:

#include double power(double base,int exponent)

if(exponent == 1)

double result=1.0;

result=power(base,exponent/2);

result*=result;

if(exponent & 0x1 == 1) //判斷指數是否為奇數

else

}return result;

}int main()

執行結果如下所示:

在上面的**中,用位與運算子代替了求餘運算子(%)來判斷指數是奇數還是偶數,位運算的效率比乘除法及求餘運算的效率要高很多。

劍指Offer 16 數值的整數次方

實現函式double power double base,int exponent 求base的exponent次方,不得使用庫函式。同時不需要考慮大數問題。看到乘方,自然想到二分加速的方法。但是這個題關注的不是速度,而是考慮問題的全面性。比如幾個邊界情況,base 0,exp 0 的時候。時間複雜...

劍指offer 16 數值的整數次方

保證base和exponent不同時為0 分析 注意考慮特殊情況,當底數為0,如果指數是正整數,則可以返回1,如果底數為0,指數是負整數,那麼就會出錯,而且如果底數不是0,指數是負整數,則返回的應該是底數和正整數運算結果的倒數。因此要考慮齊全。double powerwithunsignedexpo...

劍指offer16 數值的整數次方

思路方法一 暴力法 方法二 利用指數法則遞迴計算 分奇數和偶數 方法三 將n表示為二進位制來做 package jzoffer auther wwh date 2020 04 12 15 48 description public class mypow double ans 1 for int i...