快速冪非遞迴實現(即求x的n次方)

2021-08-09 08:34:02 字數 922 閱讀 2836

如果用遞迴的方法求冪, **可以是這樣的:

double

pow(

double x,

unsigned

int n)

注意:

n若為乙個奇數,那麼它對應的二進位制最後一位一定是1,與上1最終一定是1

上面的n為非負,如果要求負數次冪,可以先求正數次冪再用1除之

上述方法雖然簡單, 但是效率並不高. 因為函式呼叫的代價非常昂貴. 用迴圈實現的效率更高.

用迴圈做的話,當然不能直接死乘。舉個例子:

直接乘要做998次乘法,效率很低。但事實上可以這樣做,先求出2^k次冪:

再相乘:

這樣只要做16次乘法。即使加上一些輔助的儲存和運算,也比直接乘高效得多(尤其如果這裡底數是成百上千位的大數字的話)。

我們發現,把999轉為2進製數:1111100111,其各位就是要乘的數。

再舉乙個例子幫助理解,其中次角標2代表二進位制。

因此就可以寫出下面的非遞迴版**:

double

pow(

double x,

int n)

return result;

}

快速冪求x的n次方

o logn 的時間複雜度求x的n次方,x為自然數,n為整數?如果 power 5 為奇數,result儲存當前的多餘的乙個4,並在返回結果時一併與結果相乘。2 10 2 2 2 2 2 2 2 2 2 2 4 5 4 4 4 4 4 4 4 4 4 16 2 16 2 16 16 256 如果 p...

求冪的遞迴和非遞迴實現

遞迴版本的實現 long long int pow1 int x,unsigned int n if n 0x01 else return pow x x,n 1 遞迴 的基準條件是 n 0 此時返回1 不呼叫自身 若n是偶數,則x的n次方等於 x x的n 2次方。若n是奇數,則x的n次方等於 x ...

求x的N次冪

典型的減小時間複雜度的做法是記住程式已經做的事情,避免在做重複的事情,比如使用n 1個迴圈乘法就是一直在做重複的乘x。通過記住x,x2,x4,等資料,可以大大減小時間的複雜度。程式如下 包含標頭檔案 include include using namespace std double pow int...