數值的整數次方

2021-06-08 08:16:43 字數 1648 閱讀 4732

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

這道題目有以下幾點需要注意:

0的0次方是無意義的,非法輸入

0的負數次方相當於0作為除數,也是無意義的,非法輸入

base如果非0,如果指數exponent小於0,可以先求base的|exponent|次方,然後再求倒數

判斷double型別的base是否等於0不能使用==號。因為計算機表述小樹(包括float和double型小數)都有誤差,不能直接使用等號(==)判斷兩個小數是否相等。如果兩個數的差的絕對值很小,那麼可以認為兩個double型別的數相等。

根據以上4個注意點,我們可以寫出求指數的程式,**如下:

#include#include

using

namespace

std;

bool isinvalidinput=false

;double powerwithunsingedexponent(double

base,unsigned int

ab***p)

//由於精度原因,double型別的變數不能用等號判斷兩個數是否相等,因此需要寫equsl函式

bool equal(double a,double

b)double power(double

base,int

exponent)

unsigned

intab***p;

//判斷指數正負,去指數的絕對值

if(exponent<0

) ab***p=(unsigned int)(-exponent);

else

ab***p=(unsigned int

)exponent;

double result=powerwithunsingedexponent(base

,ab***p);

//如果指數小於0則取倒數

if(exponent<0

) result=1/result;

return

result;

}void

main()

假設我們求2^32,指數是32,那麼我們需要進行32次迴圈的乘法。但是我們在求出2^16以後,只需要在它的基礎上再平方一次就可以求出結果。同理可以繼續分解2^16。也就是a^n=a^(n/2)*a^(n/2),(n為偶數);或者a^n=a^((n-1)/2)*a^((n-1)/2)*a,(n為奇數)。這樣就將問題的規模大大縮小,從原來的時間複雜度o(n)降到現在的時間複雜度o(logn)。可以用遞迴實現這個思路,**如下:

double powerwithunsingedexponent(double

base,unsigned int

ab***p)

上述程式使用了遞迴的方法,這樣會增加程式的空間複雜度,下面我們使用迴圈實現遞迴的思路,**如下:

double powerwithunsingedexponent(

double

base,unsigned

intab***p)

數值整數次方

題目 實現函式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...

數值的整數次方

在寫這個問題時,先說一下對於我們寫程式時,應該考慮的問題。的規範程度 的書寫規範程度會影響面試考官閱讀 的興致,從下圖可看出,書寫 布局和命名規則都決定著 的規範性。首先,規範的 書寫清晰。絕大部分面試都要求應聘者在白紙或者白板上書寫。不要因為擔心沒時間寫 就在紙上寫潦草或者簡略。通常面試 量不會超...