快速冪的思想
列如2^10
我們將其10化為二進位制為(1010)
那麼我們可以得到
10=0* 2^0+ 1*2^1+ 0 * 2^2+ 1 2^3;
所以得到2^10 = 2^( 0 * 2^0+ 1 *2^1+ 0 * 2^2+ 1 *2^3)
最後得到 2^ (2^1) * 2^( 2^3);
在了解快速冪之前,我們還應該先了解一下位運算的倆個符號
1.按位與
c語言中符號為&
是什麼意思呢?舉了例子例如乙個數 and 1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。
相同位的兩個數字都為1,則為1;若有乙個不為1,則為0。
00101
11100
結果為00100
意思就是相同的取相同,不相同的取一;
2.左移
符號為》,類似於數學裡面的遠大於;
列如1011100>>2
結果為10111
後面的數字就是移動的位數;
接下來就可以上**了
其中難懂點的的地方詳細解說一下int
pow(
int a,
int b)
return ans;
}
這裡說的是 如果b的末位為1,就執行一次 ans=ans*base;if
(b&1
) ans=ans*base;
base=base*base;
b>>=1;
}
在這裡b已經是二進位制數了;無論末尾數是0還是1;我們都要進行一次累乘;
執行後左移一位;
while(b)直到b為零;
在弄懂快速冪之後,快速冪取模也就簡單起來;
其思想是
(ab) mod c = ((a mod c)(b mod c)) mod c
這裡不再具體證明。
有了思想後,就可以上**了
在快速冪**後面加上乙個取模就完事了;int
pow(
int a,
int b,
int c)
return ans;
}
我們求冪的本質仍然是求積。所以每次我們對base或者ans進行運算的時候,都必須使用一次分配率,所以都要mod c。
希望能有所幫助。
快速冪 快速冪取模演算法
在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...
快速冪與快速冪取模
快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o log?n 與樸素的o n 相比效率有了極大的提高。而快速冪取模就是對冪運算後結果進行取模運算。在程式設計過程中可能會遇到要求乙個很大的數的模,為了得到乙個能計算更大範圍,速度更快的演算法,快速冪取模演算法應運而生。一.計算冪,計算a ...
快速冪與快速冪取模
對大數時間複雜度的優化,具體操作是利用二進位制操作 11的二進位制是1011,11 2 1 2 0 2 1 2 1,因此,我們將a 轉化為算 a 20 a 21 a 23 看出來快的多了吧原來算11次,現在算三次 運算還可以判斷奇偶x 1 0為偶,x 1 1為奇 int ksm int a,int ...