HDU 2035 人见人爱A^B(二分求幂,快速求幂):http://acm.hdu.edu.cn/showproblem.php?pid=2035 使用大数据思想在数组中求:
两种垃圾做法:
#include <iostream> #include <cstdio> using namespace std; int main(){ int m,n; while(~scanf("%d %d", &m, &n)) { if(m==0&&n==0) break; int a[3],b[3],c[3]={0,0,0},i; for(i=0;i<3;i++) { a[i]=b[i]=m%10; m=m/10; } n--; while(n--) { for(i=0;i<3;i++) for(int j=0 ; j<3;j++) { if(j+i<3) { c[j+i]=a[i]*b[j]+c[j+i]; if(c[j+i]>9) { if(i+j+1<=2) c[i+j+1]=c[j+i+1]+c[j+i]/10; c[i+j]=c[j+i]%10; } } } b[0]=c[0],b[1]=c[1],b[2]=c[2]; c[0]=c[1]=c[2]=0; } printf("%d\n",b[2]*100+b[1]*10+b[0]); } return 0; }
#include<iostream> using namespace std; int main() { int m,n; while(scanf("%d %d", &m, &n)!=EOF) { if(m==0&&n==0) break; m=m%1000; int w=m; n--; while(n--){ m=m*m%1000; } cout<<m<<endl; } }
相对来说下面的两种还是蛮不错的这应该算是快速幂中的一种吧
二分求幂
#include<iostream> #include<cstdio> using namespace std; int main(){ int a,b; int ans; while(~scanf("%d%d",&a,&b)){ if(a==0&&b==0) break; a=a%1000;//底数取余 ans=1; while(b>0){ if(b%2==1)//1.奇数时,多出来的一项提前放到ans里 2.b==1时,完成结果和底数的最后一次相乘 ans=(ans*a)%1000;//结果取余 a=(a*a)%1000;//二分操作 b=b/2;//1.二分 2.b==1时,b/2=0,作为结束循环的条件 } printf("%d\n",ans); } return 0; }
二分求幂(位运算)
#include<iostream> #include<cstdio> using namespace std; int main(){ int a,b; int ans; while(~scanf("%d%d",&a,&b)){ if(a==0&&b==0) break; a=a%1000; ans=1; while(b>0){ if(b&1)//判断是否为奇数,相当于 if(b%2==1) ans=(ans*a)%1000; a=(a*a)%1000; b=b>>1;//二进制向右移一位,相当于 b=b/2; } printf("%d\n",ans); } return 0; }
当然快速幂不只是用在数中,在矩阵中还会用到快速幂的用法