數值的整數次方

2021-09-23 10:39:39 字數 1596 閱讀 1500

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

自以為題目簡單的解法:用for或者while迴圈

double poweruint(double a, unsigned int ex)

return ret;

}

可是這個程式只包括了指數是正數的情況,指數是負數和零的時候怎麼辦?我們都知道,

任何非零數的零次方為1,0的0次方沒有意義,因此輸出0或1都是可以接受的。

指數為負數時,先對指數求絕對值,然後算出次方的結果再求倒數。

底數為0,指數為負數時,要對0求倒數會導致程式執行出錯,因此要做特殊處理,可以採用三種方法:返回值,全域性**和異常。    這個題的解法中我們採用了全域性變數來標識是否出錯,如果出錯則返回0值。為了區分返回的0值是輸出結果還是出錯處理,再定義乙個變數flag,初始化為0,如果是出錯導致結果輸出為0則令flag=1來標識。

計算機表示小數都有誤差,我們不能直接用等號(==)判斷,要使兩個數的差值在乙個精度內。

在考慮了指數的各種情況後,我們可以考慮優化次方函式,如輸入的指數為32,在for迴圈中需要做31次乘法。但我們可以換一種思路:

目標次數是32,如果知道了它的16次方,那麼在16次方基礎上平方就可以了。而16次方是8次方的平方,以此類推,求32次方只需要做5次乘法:先求平方,再平方基礎上求4次方,4次方基礎上求8次方,8次方基礎上求16次方,16次方,基礎上求32次方。 

可以用下面的公式求解:

#include#includeint equal(double a, double b)//比較兩個浮點數是否相等

else

}double poweruint1(double a, unsigned int ex)//低效率

while (ex--)

return ret;

}double poweruint2(double a, unsigned int n)//位運算效率比乘除法和求餘運算高

if (1 == n)

double ret = poweruint2(a, n >> 1);

//double ret = poweruint2(a, n/2);

ret *= ret;

if (1 == (n & 1))

//if (1 == (n % 2))

return ret;

}double power(double base, int exponent)

if (exponent < 0)

/*result = poweruint1(base, ex);*/

result = poweruint2(base, ex);

if (exponent < 0)

return result;

}int main()

數值整數次方

題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮 大數問題。includebool equal double num1,double num2 double powerwithunsignede...

數值整數次方

題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮 大數問題。includebool equal double num1,double num2 double powerwithunsignede...

數值的整數次方

題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大樹問題。這道題目有以下幾點需要注意 0的0次方是無意義的,非法輸入 0的負數次方相當於0作為除數,也是無意義的,非法輸入 base如果非0,如果...