前言:
某天,校花对你说:小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的你可不可以再对它进行优化,完成对负数的幂运算,中间需要注意些细节哦。完成后可以发在评论区分享。