“宝,别再傻傻地用循环计算幂了”,——二分快速幂(分治思想初现)

前言:

某天,校花对你说:小z,帮我写个程序好不好^^。

你说:那不是小菜一碟,说吧。

校花:挺简单的,我就想写一个计算a的b次幂的函数,你可以吗?

你说:当然,看我的

int pow1(int a,int b){
	int sum=1,i=1;
	while(i<=b){
		sum*=a;
		i++;
	}
	return sum;
}

校花摇了摇头:这个也太简单了吧,你能不能上点高级的。

你心想:书到用时方恨少,早知道多和博主学一点了(手动狗头😸)


好了,言归正传,快跟着小编一起学习二分快速幂吧,将来好去教校花。


学习内容:

普通的计算幂次,思想是定义一个sum=1,然后让它和x相乘n次,时间复杂度为O(n)。我们人类能够在漫长的岁月里不断生存与发展,依赖的一个重要因素是总结与优化,那么我们现在想一下这个算法还能不能对它进行优化:这个算法的基本是通过每次循环将幂次减少1,总共需要n次,这是通过减法进行降幂,要想减少循环次数,我们可以想到“加法可以变成乘法”,那么减法可不可以通过除法完成。每次将幂数除2,我们的表达式可以写成如下图:

通过这样的方法,我们可以实现快速降幂,以n=100为例,原来我们需要循环100次,现在我们通过100-50-25-12-6-3-1,只需要7次就可以结束。算法的时间复杂度降低到O(log n),是一个非常快速的算法,如果用代码实现,应用到了递归:

int pow(int a,int b){
	if(b==1) return a;
	int y=pow(a,b/2);
	if(b&1) return a*y*y;
	return y*y;
}

 这个只能适用与n>0的情况,clever的你可不可以再对它进行优化,完成对负数的幂运算,中间需要注意些细节哦。完成后可以发在评论区分享。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的代码no摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值