简单算法:快速幂

Dev.C++简单算法:快速幂。N年没打博客了,主要是最近没时间。今天带来一篇快速幂。
如果日常的幂运算你打一个for就好了。可是有些 题题意翻译成人话就是求解快速幂,那么O(n)绝对会被卡下去。
这里带来一篇简单的O(log n)手打递归快速幂。老规矩,先贴代码。

int qsm(int x,int y)//x的y次方 
{
        if(x==0||x==1)return x;//这句有没有都ok,减时间
        if(y==0)return 1;
	if(y==1)return x;
	if(y%2==0)return qsm(x,y/2)*qsm(x,y/2);
	else return qsm(x,y/2)*qsm(x,y/2)*x;
}

这里顺便加了使用方法,方便食用。急用的直接拷走就好了。
这里解释一下

当y=0时,可能出现y跳过1而变为0的情况下,故需要特判。易得\(x^0\)=1,所以return 1。
当y=1时,易得 \(x^y\) 为x,所以有了第二句
当指数是偶数时,根据\(a^b\)×\(a^c\)为a的b+c次方,所以

\(x^y\)=\(x^y\)/2 × \(x^y\)/2

故此第二句出现了,第三句同理。这就是这篇博客的全部内容了。


说句闲话,我认为快速幂没必要背。像我N年没打过快速幂了,今天来打一下,也是几分钟就写出来了。
如果你真的记不住,打一篇博客,从自己的角度理解一下,就懂了。

posted @ 2021-01-26 21:17  riced  阅读(53)  评论(0编辑  收藏  举报