目錄其實原理很簡單,有初一的學歷就好,你只需要知道(k為正整數):
x2k = xk * xk
x2k+1 = xk * xk * x
任何數的0次方都為1(除0外)
任何數的1次方都為它本身
至於為什麼,問數學老師去
然後一直遞迴下去即可
**(計算xk)
int poww(int x , int k)
這個稍微有億一點點複雜
你需要知道:
任何數都可以用2的次方(不重複)的和來表示(很簡單的道理)
10 = 2 + 8 = 21 + 23
15 = 1 + 2 + 4 + 8 = 20 + 21 + 22 +23
xa1+a2+a3+...+an= xa1 * xa2 * xa3 * ... * xan
不會的問初中數學老師去
那就出來了系不繫很簡單
再舉個栗子:
310 = 32+8 = 32 * 38
把10在二進位制下表示是(1010)2(這裡想一想位權轉換進製10 = 2 + 8 = 21 + 23 )
是不是豁然開朗了
具體實現(1
**:
int poww_loop(int x,int k)
return res;
}
不詳細講,自己寫**試試,或者到網上搜
把二進位制表示下把數字同時向左(右)移動,越界部分捨去,新增部分補0
n << p = n * 2p
n >>p = n / 2p
10 << 1 = 20
如果n&1 == 1,則n是奇數,否則n是偶數
if(n & 1 == 0)等價於 if(n % 2 == 0),但是位運算的效率會更高
遞迴 快速冪
題目 x yx y xy當y很大,採用如下方式 f x,frac times f x,frac y 2 0,y 0 1,y 0 f x,frac times f x,frac times x y 2 1,y 0 end right.f x,2 y f x,2y y 2 0,y 0 1,y 0f x ...
演算法提高 遞迴 快速冪
理解遞迴的想法不難,關鍵是如何 快速 寫出 正確 高效 的遞迴。函式遞迴呼叫的基本形式 type myfunction 下面以遞迴實現 快速冪 說明一下寫遞迴的一些注意點,這些要點是不是必要的我不知道,我想這需要嚴格的證明。一般求冪的方法是呼叫中的pow 函式,例如求 如果要造輪子的話,一種想法是用...
快速冪(遞迴和非遞迴演算法)
快速冪 exponentiation by squaring,平方求冪 簡單而高效地計算方法,演算法的時間複雜度是o log n 例題 3的5次方如何計算呢?a的n次方 p 方法一 33333 243 進行四次連乘,複雜度為o n 1 適用於a,n都很小的情況。方法二 遞迴演算法 a的n 2次方a的...