大数算法n次幂

//求小int数的高次幂问题,比如说求8的1000次 //为了体现算法思想,就比如说基数从1到9吧,幂次最大为10000吧,这样开一个10000的矩阵应该能够存下来了 #include<iostream> const int dn=10000; using namespace std; int xc(int in[],int k[]);//数字相乘 int ans[dn],anszj[dn],erjinzhi[20]; int main() { //数据处理与大数运算一样,就不用说了 //在通常求的情况下为挨个求积,算法o(n);在这先转化为二进制数,用o(lgn); int a,b,p,k;//p是用来看b转化为二进制数后共有多少位 /////////////////////////////////////////////////// //矩阵初始化 for(int i=0;i<dn;i++){ans[i]=0;anszj[i]=0;} ans[0]=1;anszj[0]=1; for(int i=0;i<20;i++)erjinzhi[i]=-1; /////////////////////////////////////////// cout<<"求a的b次方,请输入a,b(0<=a<=9,0<b<=1000,int a,b):"<<endl; cin>>a>>b; /////////////////////////////////////////////// k=b;p=0; while(k>=1) { erjinzhi[p]=k%2; k=k/2; p++; } p--; //////////////////////////////////// for(int i=0;i<=p;i++) { if(i==0){anszj[0]=a;} else{xc(anszj,anszj);} if(erjinzhi[i]==1)xc(ans,anszj); } ///////////////////////////////////////////////////////// //output k=0; for(int m=dn-1;m>=0;m--) { if(ans[m]!=0)k=1; if(k!=0)cout<<ans[m]; } if(k==0)cout<<"0"; cout<<endl; getchar(); getchar(); return 0; } ///////////////////////////////////////////////// //串相乘 int xc(int in[],int k[]) { int a=0,b=0,m[dn]; for(int i=0;i<=dn-1;i++)m[i]=0; for(int i=dn-1;i>=0;i--) if(in[i]!=0){a=i;break;} for(int i=dn-1;i>=0;i--) if(k[i]!=0){b=i;break;} /////////////////////////////// for(int i=0;i<=a;i++){ for(int j=0;j<=b;j++) m[i+j]=m[i+j]+in[i]*k[j];} ///////////////////////////// for(int i=0;i<=(a+b)+1;i++) { m[i+1]+=(m[i]/10); m[i]=m[i]; in[i]=m[i]; } return 0; }

相关文章

自1998年我国取消了福利分房的政策后,房地产市场迅速开展蓬...
文章目录获取数据查看数据结构获取数据下载数据可以直接通过...
网上商城系统MySql数据库设计
26个来源的气象数据获取代码
在进入21世纪以来,中国电信业告别了20世纪最后阶段的高速发...