題目:
編寫乙個函式double mypow(double x, int n);
求x
的n
次方,引數n
是正整數。最簡單的演算法是:
double product = 1;這個演算法的時間複雜度是θ(n)。其實有更好的辦法,比如for (i = 0; i < n; i++)
product *= x;
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 ...