整形数快速幂:
计算整形数的幂的普通算法时间复杂度为O(N),快速幂的时间复杂度为O(log N)。
基本思想:
以x^10 为例:可以看做(x^5)^2,还可以继续拆分为:(x*(x^2)^2)^5;
1. 令m=n/2。 假设已经知道如何计算xm,再来求xn。
2. 分两种情况:
如果n为偶数,xn=(xm)2
如果n为奇数,xn=x(xm)2
根据这个思想,可以得出递归的算法:
伪代码:
我们推导出迭代的算法。
推导过程:
求实数x的n次方法:
1. 令n表示为二进制dk,dk-1,...d0。n=2k+2k-1+...+20
2. 令y=1.
3. 从左到右扫描二进制数字,如果当前数字为0,y赋值y2,如果当前数字为1,y赋值xy2。
伪代码:
具体实现代码:
#include<iostream>
using namespace std;
int Pow(int a,int m){
int temp;
temp = 1;
while(m){
if(m&1){
temp*=a;
}
a*=a;
m/=2;
}
return temp;
}
int main(){
int n,m;
cin>>n>>m;
cout<<Pow(n,m);
return 0;
} 幂数较大,最终结果超出整数范围:
#include<iostream>
using namespace std;
int a[10000];
int main(){
int n,m;
scanf("%d%d",&n,&m);
a[0] = 1;
int len=1,jin=0;
for(int i = 1;i <= m;i++){
for(int j = 0;j < len;j++){
int temp = a[j]*n+jin;
a[j] = temp%10;
jin = temp/10;
}
while(jin){
a[len++] = jin%10;
jin /= 10;
}
}
for(int i = len-1;i>=0;i--){
printf("%d",a[i]);
}
return 0;
}

645

被折叠的 条评论
为什么被折叠?



