顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。
我们举个例子,假设要求a的14次方,把14转二进为:(1110)2_22,a的14次方就是a的(1110)2_22次方,示例如下:
a14^{14}14=a(1110)2^{(1110)_2}(1110)2=a(0+2+4+8)^{(0+2+4+8)}(0+2+4+8)=a0^00× a2^22 × a4^44 × a8^88
观察(1110)2_22这个二进制的4位,如果数字为0,不需要累乘到答案里面,如果数字为1需要累乘对应的基数(a的2i^ii 次方)到答案里面。
为此我们需要解决几个问题:
1、遍历14的每个二进制数
int b=14;
while(b){
b>>=1;//右移运算,b右移一位
}
2、判断b的最后一位是不是0
if(b&1) //
1这个数在计算机内部会转换成000…0001,b&1是b和1的按位与运算,只有b的二进制最后一位是1的情况下结果才是1
综合以上,写出求a的b次方的快次幂函数如下:
long long quickpower(long long a,long long b){
long long ans=1,base=a;
while (b){ //遍历b的每个二进制位
if(b&1){//b的最后一位是1
ans*=base;//这个时候需要累成基数
}
base*=base;//b的每个二进制位代表a的n个2次方(n对应第几位)
b>>=1;
}
return ans;
}

234

被折叠的 条评论
为什么被折叠?



