題目:實現函式double power(double base,int exponent),求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。
思路:
題目看起來很簡單,好像乙個迴圈的相乘就可以得到結果,但是這種思考方式是很危險的,因為沒有考慮到邊界情況和特殊輸入的情況,比如指數為負數時候的情況和指數為正數的情況是不一樣的。又比如輸入的底數為0,但是指數為負數,這樣就會出現0做分母的情況,這個時候程式就需要做出相應的響應來應對這種情況。所以,在編寫程式的時候一定要考慮周全,注意細節。
**:
bool g_invalidinput = false;//用來反映輸入資料是否是無效的標誌
bool equal(double num1, double num2)//自定義的比較函式,double型別不能直接用「=」來比較
double power(double base, int exponent)
unsigned int ab***ponent = (unsigned int)exponent;//這種求絕對值的方法要記住
if (exponent < 0)
ab***ponent = (unsigned int)(-exponent);
double result = powerwithunsignedexponent(base, ab***ponent);
if (exponent < 0)//處理指數為負數的情況
result = 1.0 / result;
return result;
}//求乘方更高效的解法
double powerwithunsignedexponent2(double base, unsigned exponent)
上面有乙個求乘方更高效的方法,比如要求2的32次方,可以先求2的16次方,求2的16次方可以先求2的8次方,依次推下去,可以用遞迴的方法來實現。
這裡位運算的效率要比除法高很多,還有注意怎麼判斷乙個數是不是奇數,用x & 0x1的方法。
**:
double powerwithunsignedexponent2(double base, unsigned exponent)
複習:這道題給我的最大感受就是要細心,考慮到各種情況對應 的結果,還有乙個最後求指數的值,這種思路很好,可以節省時間,提高效率。
二刷**:
bool g_invalidinput = false;
double power(double base, int exponent)
unsigned int ab***ponent = (unsigned int)exponent;
if (exponent < 0)
ab***ponent = (unsigned int)(-exponent);
double result = powerwithunsignedexponent(base, ab***ponent);
if (exponent < 0)
result = 1.0 / result;
return result;
}double powerwithunsignedexponent(double base,unsigned int ab***ponent)
bool equal(double a, double b)
}
劍指offer 面試題16
include 思路 遍歷鍊錶過程中,將各個指標入棧,再出棧進行反轉 listnode reverselist listnode phead pnode pnodestack.top listnode pfront pnode pnodestack.pop while pnodestack.empt...
劍指Offer 面試題16 數值的整數次方
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。保證base和exponent不同時為0 題目比較簡單,但是需要全面考慮問題,主要是對冪次進行分類,1.exponent 0 這種情況只需要進行常規操作,無需特殊處理2.exponent 0...
劍指offer 面試題16 數值的整數次方
問題 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。輸入 double型浮點數base,int型整數exponent。輸出 double型結果。思路 本題思路不難,但是容易忘記處理各種邊界值,異常值。當exponent為正數時,base...