快速求正整數次冪,當然不能直接死乘。舉個例子:
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...