正常的求冪就是一直累乘如下
#include
intmain()
}
這種方法實現很簡單,但是有時候挺浪費時間,於是就有了快速冪。
關於快速冪,用乙個簡單的例子說明比較容易理解。
關於nm舉乙個實際,比如2^11。
通常我們使用累乘法需要運算10次。
211 = 2* 2* 2* 2* 2* 2* 2* 2* 2* 2* 2。
而我們可以將11轉化為二進位制可為1011,變成加權的表示式為
11 = 1* 20 + 1* 21 + 0* 22 + 1* 23。
211 = 2^(1* 20) * 2^(1* 21) * 2^(1* 23) 。
而我們只需要計算乘到23和三次累加操作即可,明顯降低了運算時間。
我們可以通過位運算直接逐位獲得m為尾值,遇0將2累乘,遇1將累乘的值乘到結果,即可得到結果。
**如下
#include
intmain()
}int
pow(
int n,
int m)
return ans;
}
快速冪取模需要用到數學裡的乙個公式:
ab % c = (a % c)b % c。
在快速冪的基礎上,我們可以很快將改進程式寫出。
#include
intmain()
}int
pow(
int n,
int m,
int c)
return ans;
}
如此即為快速冪取模 快速冪與快速冪取模
快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 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 ...
快速冪與快速冪取模
intmi int a,int b return num 這種暴力求法的時間複雜度是o n 為了降低時間複雜度,我們引用快速冪,它的時間複雜度縮短到o logn 我認為快速冪之所以快,主要是運用到了位運算。對於位運算,我們舉個例子 比如 2 13 13的二進位制為1101,那我們可以得到1 2 0 ...