題目:實現函式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...