超級詳細的基礎算法和數據結構合集:
https://blog.csdn.net/GD_ONE/article/details/104061907
摘要
本文主要介紹快速冪算法,快速冪雖然代碼簡單,但是往往會與其他算法相結合,很重要。
引言
當我們計算 時,常用的做法是對連乘次, 但如果特別大,假如, 如果仍然對次的話,時間消耗就太大了。那麼我們如何
在短時間內求出一個數的次方呢。
求
我們可以考慮對樸素方法進行優化。
1:當我們計算得到時, 我們可以直接使用連乘次。 這樣做時間複雜度變爲了
2:有人可能會問,我們既然可以用次,爲什麼不用連乘次呢,當然可以這樣做之後時間複雜度變爲了;
3 : 我們當然也可以
4:所以我們可以用:
快速冪就是類似的思想。
快速冪
先舉個例子:
怎麼把一個二進制數轉化爲十進制數呢?
計算過程是:
我們可以發現:如果將最開始求變爲:, 計算量將會大大減少,原本需要乘11次,現在只需要乘4次。
另外,我們需要判斷二進制數的某一位是不是0,我們可以使用位運算方便的解決該問題。
快速冪代碼:
public static int qmi(int a, int b){ //求 a^b
int res = 0; // res保存結果
while(b != 0){
if((b & 1) == 1){ //如果k的二進制數的最後一位是 1。 比如1011 & 1 = 1
res = (res + a) % mod;
}
a = a * a % mod;//得到 a^1, a^2, a^4, a^8, .....
b = b >> 1; //將b右移一位,去掉最低位。爲了開始判斷下一位。
}
return res;
}
代碼很簡單,多看幾遍就懂了。如果對位運算不熟悉可以翻看之前的博客。