根据上面的操作,我们可以发现:
当我们在运算 a^b 时,我们只需将 b 进行二进制分解。
若 b\ne0, 则每次进行如下操作:
若 b 用二进制表示的最低位为 1, 则说明此时 a 已经自乘足够的次数,我们需要将其更新至总答案中,并将 b 的这一最低二进制位由 1 变为 0。随后,按照 b 用二进制表示的最低位为 0 的情况继续处理。
若 b 用二进制表示的最低位为 0, 则说明此时 a 还没有自乘足够的次数,a 自乘,不用将其更新至总答案中。
已经处理完 b 用二进制表示的最低位,需要继续处理下一位。此时,我们只需将 b 右移一位,即除以二。在下一次处理时,待处理的 b 用二进制表示的次低位就成为了 b 用二进制表示的最低位。
重复这个过程,直至 b=0。
下附快速幂函数模板代码:
int qm (int n) {//快速幂
int res=1;//result 一定要初始化为1,不然可能用0乘了很多次,最终结果还是0,乘了个寂寞
int trans=base;//transfer base是底数a
while (n) {// n次方
if (n&1) res=res*trans;//该二进制位上是1,将临时存储变量 transfer 的值,转移到结果 result 上
trans=trans*trans;//该二进制位上是0,临时存储变量 transfer 自乘
n>>=1;//二进制右移一位(除以二)
}
}