二分法快速計算x的n次冪(遞迴和迴圈實現)

2021-06-17 00:39:48 字數 789 閱讀 5120

題目:

編寫乙個函式double mypow(double x, int n);xn次方,引數n是正整數。最簡單的演算法是:

double product = 1;

for (i = 0; i < n; i++)

product *= x;

這個演算法的時間複雜度是θ(n)。其實有更好的辦法,比如mypow(x, 8),第一次迴圈算出x·x=x2,第二次迴圈算出x2·x2=x4,第三次迴圈算出4·x4=x8。這樣只需要三次迴圈,時間複雜度是θ(lgn)。思考一下如果n不是2的整數次冪應該怎麼處理。請分別用遞迴和迴圈實現這個演算法。

整理解答如下:

另參考: 

#include //將n拆解為二進位制n[i](0b),從低位往高位,則x^n[i]各位分別代表因子x^1,x^2,x^4,x^8,…用變數accum在迴圈中儲存該累乘.

//而n拆解後對應的某位若為1則表示結果應該含這部分乘積因子

//如x^6=x^110b=(x^1)*0+(x^2)*1+(x^4)*1,而x^8=x^1000b=(x^1)*0+(x^2)*0+(x^4)*0+(x^8)*1。

double mypow2(double x, int n)

return pw;

}double mypow(double x, int n)

void main()

}

快速冪(二分法,位運算)

想弄清本題演算法,需要先了解取模 求餘 運算的一些性質,比如 遞迴的思想就是利用二分法。它基於如下事實 1 如果p是奇數,那麼有bp b bp 1 2 如果p是偶數,那麼有bp bp 2 bp 2 且臨界值b0 1.注意 不能直接寫成return binarypow b,p 2,k binarypo...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

遞迴二分法查詢

二分法使用了折半查詢的思想,不斷的變化,陣列下標的起始位置 begin 和終止位置 end 來進行搜尋。我們使用兩種演算法,解決二分查詢 public class solution system.out.println solution.sort number,0,number.length,56 ...