如果用遞迴的方法求冪, **可以是這樣的:
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...