劍指offer:面試題11——數值的整數次方
題目:給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
思路一:for迴圈計算出數的整數次方,注意一下幾點:
1)0的負數次方出錯,返回值0,需要定義乙個全域性變數表示出錯狀態
2)0的正整數次冪為0
3)在比較base值是否為0或1的時候不能直接base== 1或base== 0,因為計算機中浮點型表示小數時存在誤差,(double和float)
因此判斷兩個小數是否相等必須判斷兩個值的差的絕對值是否在乙個範圍內,若在,則判定它相等。
解決比較大小的方法是利用isequal函式,**如下:
class solution
public:
double
power
(double base,
int exponent)
/*注意:這裡不能使用如下寫法之間判斷base是否為0,因為浮點型在計算機內表示小數時存在誤差,(double和float)
因此判斷兩個小數是否相等必須判斷兩個值的差的絕對值是否在乙個範圍內,若在,則判定它相等。
if(base == 1)
*/if(
isequal
(base,
1.0)
)return
1.0;
if(exponent<0&&
isequal
(base,0)
)//0沒有負數整數次冪,返回出錯
int i;
double result=base;
if(exponent>0)
else
return result;}}
;
思路二:
當n為偶數時,an=a(n/2) * a^(n/2);
當n為奇數時,an=a( (n-1)/2) * a^( (n-1)/2) * a ;
因此可以將時間複雜度從o(n)變為o(logn)
使用遞迴實現
注意:在除2時,可以使用右移的方法
在計算奇偶性時,可以用數&0x1 判斷二進位制位數是否為1(奇偶)
還要注意此處int型指數為了方便運算轉換為了unsigned int型
具體**如下:
class solution
public:
double
powerwithunsignedexponent
(double base,
unsigned
int exponent)
public:
double
power
(double base,
int exponent)
/*注意:這裡不能使用如下寫法之間判斷base是否為0,因為浮點型在計算機內表示小數時存在誤差,(double和float)
因此判斷兩個小數是否相等必須判斷兩個值的差的絕對值是否在乙個範圍內,若在,則判定它相等。
if(base == 1)
*/if(
isequal
(base,
1.0)
)return
1.0;
if(exponent<0&&
isequal
(base,0)
)//0沒有負數整數次冪,返回出錯
int i;
double result=base;
if(exponent>0)
else
return result;}}
;
劍指offer面試題11
面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...
劍指Offer 面試題11 數值的整數次方
實現double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。分析 源 如下 includeusing std cout using std cin using std endl class throwerr...
劍指offer 面試題11 數值的整數次方
首先,我們分析下可能出現的情況 指數可能為負值,我們先求指數的絕對值次方,然後求導。求導,那就要考慮分母不為0的情況了。bool g invalidinput false double power double base,int exponent unsigned int ab ponent uns...