算法----快速幂

    xiaoxiao2025-05-23  33

    苍茫大地一剑尽挽破,何处繁华笙歌落。斜倚云端千壶掩寂寞,纵使他人空笑我。

    假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时,a^11=a^(2^0+2^1+2^3)。

    11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a^(2^0)*a^(2^1)*a^(2^3) ,看出来快的多了吧原来算11次,现在算三次,但是这三项貌似不好求的样子....不急,下面会有详细解释。

    由于是二进制,很自然地想到用位运算这个强大的工具: &  和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。

    代码如下:

    int poww(int a,int b){ int ans=1,base=a; while(b!=0){ if(b&1!=0)   ans*=base; base*=base; b>>=1;   } return ans; }

    PS:由于指数函数是爆炸增长的函数,所以很有可能会爆掉int的范围,根据题意决定是用 long long,还是int,还是mod某个数。

    最新回复(0)