快速幂

本文介绍了一种高效计算幂运算的方法——快速幂算法。该算法基于递归思想,通过减少乘法次数来降低时间复杂度,从O(N)优化到O(log_2N),并提供了C++实现代码。

【题目】
求一个数aaannn次幂是多少?
(这个问题还是值得我小骄傲一下~毕竟没学过就很快想到了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=264=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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值