【题目】
求一个数aaa的nnn次幂是多少?
(这个问题还是值得我小骄傲一下~毕竟没学过就很快想到了hh ~)
【解法】
常规思想:
forforfor循环,时间复杂度O(N)O(N)O(N)
快速幂:
想象一个数161616,告诉你基数为222,如何迭代可以最快计算得到161616?
222——>2×2=42\times2=42×2=4——>4×4=164\times4=164×4=16
快速幂正是基于此思想。
时间复杂度O(log2N)O(log_2N)O(log2N)
另外,假设这个数为262^626,也就是646464,快速幂可以得到242^424,对于剩下的系数6−4=26-4=26−4=2,可以再通过快速幂计算一次结果,将之与242^424相乘即可得最终结果——这显然是一个递归就可以实现。
还有,别忘了递归终止条件!即已经计算的幂与整体幂的差值为000时终止,返回111与调用层相乘。
【代码】
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 10000 + 10;
int quickPow(int a, int n)
{
if (!n) return 1;
int res = a;
int ex = 1;
while ((ex << 1) <= n)
{
res *= res;
ex <<= 1;
}
return res * quickPow(a, n - ex);
}
int main()
{
int a = 2, n = 10;
cout << quickPow(a, n);
return 0;
}
本文介绍了一种高效计算幂运算的方法——快速幂算法。该算法基于递归思想,通过减少乘法次数来降低时间复杂度,从O(N)优化到O(log_2N),并提供了C++实现代码。
20万+

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



