您的位置:首页 > 文旅 > 美景 > 快速幂(算法篇)

快速幂(算法篇)

2024/12/23 12:13:19 来源:https://blog.csdn.net/hellmorning/article/details/139918167  浏览:    关键词:快速幂(算法篇)

算法之快速幂

快速幂算法

概念

  • 计算XN的最常见的算法是使用N-1次乘法自乘,但是可以使用一种将利用分治思想跟递归结合的算法更好,效率更高。判断N是偶数还是奇数,如果是偶数的话,我们有XN=XN/2*XN/2,如果为奇数,我们有XN=X(N-1)/2*X(N-1)/2*X,然后在不断的递归并将N等于0和N等于1为递归的基准情形,当N等于1返回X,该算法的时间复杂度为O(logn)

代码:

  • 递归
long int Pow(long int X,long int N){if(N==0)return 1;if(N==1)return X;if(X%2==0){return Pow(X*X,N/2);}else{return Pow(X*X,N/2)*X;}
}
  • 非递归
//有些题目数字过大防止溢出会对结果取模
long long quickpow(long long a,long long b,int mod){long long res=1;if(b==0) return 1;while(b){//b为奇数if(b%2==1){res=res*a%mod;}b/=2;a=a*a%mod;}return res;
}
  • 位运算加速:假设我们要求a的11次方那么他会分解成8+2+1,那如何将其分解成8+2+1的情况,我们可以将其转换成二进制,11的二进制为1011,11=1*23+0*22+1*1+1*20,这样我们每次取11的二进制的最后一位这样就能分解成8+2+1了

    long long quickpow(long long a,long long b,int mod){long long res=1;if(b==0) return 1;while(b){//b&1就可以等价于b%2==1,如果b为偶数b&1==0,为奇数b&1==1if(b&1){res=res*a%mod;}b>>=1;  //等价于b/=2a=a*a%mod;}return res;
    }
    

尾言

完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)

  • 博客1: codebooks.xyz
  • 博客2:moonfordream.github.io
  • github项目地址:Data-Structure-and-Algorithms

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com