概述
快速幂算法,名如其意,就是快速求一个数a的b次幂的算法,常见于竞赛题目、上机笔试题等要求时间的场景。
思路
任何一个整数都可以表示成二进制的形式,比如你想求10的50次方,50的二进制表示为110010,即,所以
。我们根据10的1次方可以快速的求出10的2次方(进行相乘即可)。由10的2次方可以快速求出10的4次方,由10的4次方可以快速求出10的8次方.....。所以这种算法就可以极快的算出a的b次幂,对于10的50次方来说,50转化为二进制共有6位,我们只需要做6次乘法运算即可。
假设我们知道10的25次方是多少,再进行一次乘法运算就可以了,而
可以转化为
,每次指数级别的下降,从而达到了
的时间复杂度了。
通解公式:b为偶数:
b为奇数:
由此公式我们便可以写代码了。
代码
/**
* 快速幂算法求解a^b,对M取模。
*/
public long quickPow(long a, long b, long M) {
if (b == 0) {
return 1;
} else if ((b & 1) == 1) {
return a * quickPow(a, b - 1, M) % M;
} else {
// System.out.println("运算了");
// return quickPow(a, b>>1, M) * quickPow(a, b>>1, M);
// 防止越界
long temp = quickPow(a, b >> 1, M) % M;
return temp * temp % M;
}
}
总结
遇事多想,大佬的思路确实厉害!