快速幂的递归与递推

/*快速幂
输入a,b,求a^b
*/
#include<iostream>
using namespace std;
int ksm(int a, int b)
{
	if (b == 0)
		return 1;
	if (b == 1)
		return a;//递归终止条件
	else
		return(ksm(a, b / 2)*ksm(a, b / 2)*ksm(a, b % 2));//将a^b分成a^(b/2)*a^(b/2),b%2判断b是否刚好为2的整倍数,是的话ksm(a,b%2)返回1,否则返回a
}//递归法
int ksm(int a, int b, int ans)
{
	while (b)
	{
		if (b % 2 == 0)
		{
			b = b / 2;
			a = a * a;
		}
		else {
			b = b - 1;
			ans=ans*a;
		}
	}
	return ans;
}//递推法
int main()
{
	int a;
	int b;
	int ans = 1;
    cin >> a;
	cin >> b;
	ans = ksm(a, b, ans);
	cout << ans << endl;
	ans= ksm(a, b);
	cout << ans<< endl;
system("pause");
return 0;
}

a^b可以看作a^b/2*a^b/2,a^b/2可以看作a^b/4*a^b/4,所以可以用递归的方法见将a^b简化

注意递归的结束条件:

当指数为0是,与底数无关,a^b恒为1

b被分为b/2与b/2,b/2被分为b/4与b/4,最终被分成1

注意:b/2只能取整,所以当b为奇数是,要多乘以一个底数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值