1. 程式人生 > 其它 >快速冪運算

快速冪運算

int quick(int a,int b,int c)
{
int ans=1; //記錄結果
a=a%c; //預處理,使得a處於c的資料範圍之下
while(b!=0)
{
if(b&1) ans=(ans*a)%c; //如果b的二進位制位不是0,那麼我們的結果是要參與運算的
b>>=1; //二進位制的移位操作,相當於每次除以2,用二進位制看,就是我們不斷的遍歷b的二進位制位
a=(a*a)%c; //不斷的加倍
}
return ans;
}

 

 & 和 >> ,&運算通常用於二進位制取位操作,例如一個數 & 1 的結果就是取二進位制的最末位。還可以判斷奇偶x&1==0為偶,x&1==1為奇。>>運算比較單純,二進位制去掉最後一位

 

先看看怎麼求a的a次方更快:

 

你看,只有指數對應的位為1,才相乘
而且每個乘的數都有規律,
假設a^2^0=c,a^2^1=c*c=c1,
a^2^2=c1*c1
那就用一個數存c,然後迴圈乘就行,
至於什麼時候算在最終結果之內,只要看指數對應的位是否為一