快速幂的算法

求幂的方法,想到的第一个就是把一个数连乘n遍。复杂度O(n)。
很显然,在一些卡数据的题目中,加一个O(n)的算法容易TLE,于是就引出了今天的主题:快速幂。
快速幂的原理很简单,就是把 a b a ^b ab的b转化成二进制,然后依据位运算计算。
例如:将 5 15 5 ^{15} 515 的15换成1111,然后计算 5 1 5 ^{1} 51× 5 2 5 ^{2} 52× 5 4 5 ^{4} 54× 5 8 5 ^{8} 58,利用位运算计算2,4,8就可以了。

由于是二进制,很自然地想到用位运算(随后在博客中补充)这个强大的工具:&和>> :
&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。
运算比较单纯,二进制去掉最后一位,不多说了,放代码。

int quickpow(int base, int pow) {
    int ans = 1;
    while (pow != 0) {
        if ((pow & 1) != 0)
            ans *= base;	//如果这一位是1,结果就加上这个权值所代表的值。
        base *= base;		//将幂的权值翻倍,如2变4,4变8.
        pow >>= 1;		//把b的二进制位右移。
    }
    return ans;
}

这种算法的复杂度是O( l o g 2 log _2 log2n)。

随后会补充利用快速幂做题的例子。

你可能感兴趣的:(算法)