//求小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;
}
//为了体现算法思想,就比如说基数从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()
{
}
/////////////////////////////////////////////////
//串相乘