快速求幂算法
来源:互联网 发布:身材测算软件 编辑:程序博客网 时间:2024/04/27 09:14
求解幂次式P^N,这里介绍三种方法(或者可以说两种)
一、朴素循环法(效率低)O(N)
int Get_mi(int p,int n){int temp=p;for(int i=1;i<n;i++)p*=temp;return p;}
二、二进制法递归求解(递归次数为O(len),len为n的二进制长度。理论上时间复杂度要大于O(len),由于要使用系统栈)
给出下面一个例子。
2^9 = 2^4 * 2^4 * 2
2^8 = 2^4 * 2^4
2^7 = 2^3 * 2^3 * 2
2^6 = 2^3 * 2^3
可以看出:
x^n = x^(n/2) * x^(n/2) (n为偶数)
x^n = x^(n/2) * x^(n/2) * n (n为奇数);
那么就可以据此编写递归函数了。
int Get_mi(int p,int n){if(n==1) return p;if(n==0) return 1;if(n&1) return Get_mi(p,n>>1)*Get_mi(p,n>>1)*p;else return Get_mi(p,n>>1)*Get_mi(p,n>>1);}int Get_mi(int p,int n){if(n==1) return p;if(n==0) return 1;if(n&1) return Get_mi(p*p,n>>1)*p;else return Get_mi(p*p,n>>1);}
三、最高效的算法。将上述递归算法改为非递归形式即可。利用了二进制思想:例如
2^3,3二进制为011,末尾位1,则乘以2,前一位为1,则乘以2*2,第一位为0,则不乘。算法结束。真正实现了时间复杂度为O(len),len为p二进制位数
下面是代码:
int Get_mi(int p,int n){int sq=1;while(n>0){if(n&1) sq*=p;p*=p;n>>=1;}return sq;}
0 0
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 常用算法-快速求幂
- 【算法】矩阵快速求幂
- 快速求幂二分算法
- 算法 二分求幂(快速取幂)
- 非递归快速求幂算法
- 经典算法~~快速求幂的方法
- LeetCode Super Pow(快速求幂算法)
- 韩版女服装代理/分销平台/网店加盟免费一件代发女装代理代销货源
- LLinux系统编程(10)——进程间通信之管道
- 关于控制台程序挂载全局HOOK问题...
- [编程之美] PSet1.8 小飞的电梯调度算法
- UVA 11997 - K Smallest Sums(优先队列+多路合并)
- 快速求幂算法
- 判断鼠标从div的哪一方向划入-------Day74
- 一步一步安装CentOS 5.6操作系统
- 【Visual C++】游戏开发笔记三十 DirectX11 2D纹理映射知识全攻略
- 解决Oracle登陆老是报ora-12514错误
- 黑马程序员_关于交通灯管理系统的总结
- CDN小文件的原理
- Unidirectional TSP - UVa 116 dp
- zoj1674