快速幂算法,模板
对于计算比较大的幂的结果时可以采用快速幂来降低时间复杂度
例如求K的n次幂
int Pow(int K, int n) { for (int i = 0; i < n; i++) K *= K; return K; }
最朴素的思想就是直接n次循环,让K自乘n次,但是随着n的增加循环次数会越来越多,时间复杂度会很高
于是我们可以使用快速幂算法来实现幂运算的快速计算
对于快速幂算法有两种理解思路,一种是指数折半一种是将指数化为二进制数
具体可看(24条消息) 快速幂算法 超详细教程_qascetic的博客-CSDN博客
不过经过优化这两种思路的代码都一样
如下
int Quick_Mi2(int K, int n) { int ans = 1; while (n) { if (n & 1)//相当于n&(0001)(2进制),会取出n二进制的最低位数 ans *= K;//累乘 K *= K;//每次计算出K的2次方,4次方,8次方.....,可以参考二进制转换十进制的思路 n >>= 1; } return ans; }
当然也可以递归实现
int Quick_Mi1(int K,int n) { if (n == 0) return 1; if (n % 2 == 0) { int Temp= Quick_Mi1(K, n / 2); return Temp * Temp; } else { return Quick_Mi1(K, n - 1) * K; } }