11. 數值的整數次方

題目

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

解析

考慮base 和 exponent的取值分類。base和exponent可以是正數,負數,0。
(base,exponet):
(0, 0):數學上沒有意義,定義爲0,可與面試官說明。
(0,負數):需要特殊處理,無效輸入,因爲不能對0求倒數。
(0,正數):0.
(正數/負數,0):1。
(正數/負數, 負數):先求exponent絕對值次冪,然後對結果求倒數。
(正數/負數, 正數):正常求冪

兩種改進
1. double 型不能用”==”判斷是否等於某值(精度問題),如果兩者之差的絕對值小於一個設定的最小數,則可以認爲它們是相等的。
2. 優化求冪的過程:發現如果求a的16次方,可以先求8次方,然後8次方平方;要求8次方,可以先求4次方,然後4次方平方,依次類推。。。(遞歸求解,需要考慮exponent的奇偶問題)

實現

double Power(double base, int exponent)
{
    g_InvalidInput = false;

    if(equal(base, 0.0) && exponent < 0) //底數是0,指數是負數的,視爲無效輸入,輸出爲0
    {
        g_InvalidInput = true;
        return 0.0;
    }
 //求指數的絕對值
    unsigned int absExponent = (unsigned int)(exponent);
    if(exponent < 0)
        absExponent = (unsigned int)(-exponent);
 //無符號求冪方法
    double result = PowerWithUnsignedExponent(base, absExponent);
 //如果指數爲負數,需要對結果求倒數
    if(exponent < 0)
        result = 1.0 / result;

    return result;
}

/*
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    double result = 1.0;
    /
    for(int i = 1; i <= exponent; ++i)
        result *= base;

    return result;
}
*/
//上面無符號求冪方法的改進,需要注意指數的奇偶性
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;

    double result = PowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;
    if((exponent & 0x1) == 1)
        result *= base;

    return result;
}

//比較兩個小數的方法
bool equal(double num1, double num2)
{
    if((num1 - num2 > -0.0000001)
        && (num1 - num2 < 0.0000001))
        return true;
    else
        return false;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章