實現函式double power(double base, int exponent),求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。
三思而後行,這道題如果沒事實現考慮好,非常容易出錯。
首先分析列舉出所有的場景。
base的值 可能為正數也可能為負數(包含整數、小數)
exponent的值可能為正整數也可能為負整數
base的值的處理是比較簡單的,對於exponent的處理就要多加考慮了。
當exponent的值為負數的時候,可以求其絕對值,算出次方的結果後再取倒數。但是這個時候會有乙個特殊條件:base的數值為0,此時必須進行特殊處理,不然對0求倒數肯定出問題。
關於運算的話,就簡單多了,進行exponent個base的相乘。對位運算了解少的可以參考我這篇文章盤點那些能綠天綠地綠巨人的位運算操作
遞推寫法
public
class
power
else
if(exponent <0)
result =1/
powercore
(base,
-exponent);}
else
return result;
}private
double
powercore
(double base,
int exponent)
exponent>>=1;
base*=base;
//指數右移一位,則底數翻倍
//舉例:10^1101 = 10^0001*10^0100*10^1000
//即10^1+10^4+10^8
}return result;
}}
涉及到求解某數的n次方問題時,可以採用遞迴來完成,即利用以下公式:
遞迴寫法
public
class
power
else
if(exponent <0)
result =1/
powercore
(base,
-exponent);}
else
return result;
}private
double
powercore
(double base,
int exponent)
}
劍指Offer對答如流系列 醜數
我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...
劍指Offer對答如流系列 剪繩子
給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...
劍指Offer對答如流系列 包含min函式的棧
定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...