快速求冪演算法

2021-08-09 05:31:24 字數 930 閱讀 4011

快速求正整數次冪,當然不能直接死乘。舉個例子:

3 ^ 999 = 3 * 3 * 3 * … * 3

直接乘要做998次乘法。但事實上可以這樣做,先求出2^k次冪:

3 ^ 2 = 3 * 3

3 ^ 4 = (3 ^ 2) * (3 ^ 2)

3 ^ 8 = (3 ^ 4) * (3 ^ 4)

3 ^ 16 = (3 ^ 8) * (3 ^ 8)

3 ^ 32 = (3 ^ 16) * (3 ^ 16)

3 ^ 64 = (3 ^ 32) * (3 ^ 32)

3 ^ 128 = (3 ^ 64) * (3 ^ 64)

3 ^ 256 = (3 ^ 128) * (3 ^ 128)

3 ^ 512 = (3 ^ 256) * (3 ^ 256)

再相乘:

3 ^ 999

= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)

= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3

這樣只要做16次乘法。即使加上一些輔助的儲存和運算,也比直接乘高效得多(尤其如果這裡底數是成百上千位的大數字的話)。

我們發現,把999轉為2進製數:1111100111,其各位就是要乘的數。這提示我們利用求二進位制位的演算法:

#include 

#include

//迴圈演算法

int loop(int a,int b)

ret = ret*ret;//求a的n次方

b>>=1;

}return tem;

}int main()

return

0;}

演算法 快速冪,快速冪求逆元

基本思想 3 11 11 1011 3 1 3 3 2 9 3 4 81 3 8 6561 3 11 3 9 6561 第一種 當資料範圍m,k,p 10 9 int qmi int m,int k,int p return res 值得一提 k 1 除以2向0取整 詳細可以看狀態壓縮dp 內含位運...

快速求冪演算法

我們知道在數學表示式中pow x,n 表示求x n的冪。一般情況下,如果我們要寫乙個程式的話,最簡單的程式可能是這樣的 int pow int x,int n return result 通過使用如上的程式,2 4 2 2 2 2,在程式中做了4 1 3次乘法,但是有沒有更高效的演算法來減少乘法的次...

快速求冪演算法

在寫乙個數的冪運算的時候我們通常會想到比較直觀的o n 演算法,如下 include int main printf d res 最近在做資料結構習題的時候學習到了一中快速求冪演算法,時間複雜度為log2 n 這個演算法運用到了二進位制數的除2運算,二進位制的除法與十進位制基本類似,下面舉乙個例子2...