今天花了比较长的时间编写这个程序,感觉编程的速度还是不够快,不过收获也比较大,在POJ上通过了,很开心,这个还是属于大整数计算问题(大整数乘法)。
#include <iostream>
#include <string.h>#include <fstream>
#define M 260
using namespace std;
void MaxIntegerMul(int *a,int *b,int *c)
{//c=a*b a,b,c是M位整数(整数数组)
int m=M-1;
for(int i=M-1;i>=M/2;i--)
{
if(b[i]==0) {m--;continue;}
int n=m;
int jinwei=0;
for(int j=M-1;j>=M/2;j--)
{
int x=c[n]+a[j]*b[i]+jinwei;
c[n]=x%10;
jinwei=x/10;
n--;
}
m--;
}
}
void LargeIntegerExp(int *a,int n,int *b)
{
int c[4][M];
memset(c,0,sizeof(int)*M*4);
if(n==1) { for(int i=0;i<M;i++) b[i]=a[i]; return ;}
MaxIntegerMul(a,a,c[0]);
if(n==2) { for(int i=0;i<M;i++) b[i]=c[0][i]; return ;}
if(n==3) { MaxIntegerMul(a,c[0],b); return ;}
MaxIntegerMul(c[0],c[0],c[1]);
if(n==4) { for(int i=0;i<M;i++) b[i]=c[1][i]; return ;}
if(n==5) { MaxIntegerMul(a,c[1],b); return ;}
if(n==6) { MaxIntegerMul(c[0],c[1],b); return ;}
if(n==7) {
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[1],c[0],d);
MaxIntegerMul(a,d,b);
return ;
}
MaxIntegerMul(c[1],c[1],c[2]);
if(n==8) { for(int i=0;i<M;i++) b[i]=c[2][i]; return ;}
if(n==9) { MaxIntegerMul(a,c[2],b); return ;}
if(n==10) { MaxIntegerMul(c[0],c[2],b); return ;}
if(n==11) {
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[2],c[0],d);
MaxIntegerMul(a,d,b);
return ;
}
if(n==12){MaxIntegerMul(c[2],c[1],b); return;}
if(n==13) {
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[2],c[1],d);
MaxIntegerMul(a,d,b);
return ;
}
if(n==14){
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[2],c[1],d);
MaxIntegerMul(c[0],d,b);
return ;
}
if(n==15){
int d[M]; memset(d,0,sizeof(int)*M);
int e[M]; memset(e,0,sizeof(int)*M);
MaxIntegerMul(c[2],c[1],d);
MaxIntegerMul(c[0],a,e);
MaxIntegerMul(d,e,b);
return ;
}
MaxIntegerMul(c[2],c[2],c[3]);
if(n==16) { for(int i=0;i<M;i++) b[i]=c[3][i]; return ;}
if(n==17) { MaxIntegerMul(a,c[3],b); return ;}
if(n==18) { MaxIntegerMul(c[3],c[0],b); return ;}
if(n==19) {
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[3],c[0],d);
MaxIntegerMul(a,d,b);
return ;
}
if(n==20) { MaxIntegerMul(c[3],c[1],b); return ;}
if(n==21) {
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[3],c[1],d);
MaxIntegerMul(a,d,b);
return ;
}
if(n==22){
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[3],c[1],d);
MaxIntegerMul(c[0],d,b);
return ;
}
if(n==23){
int d[M]; memset(d,0,sizeof(int)*M);
int e[M]; memset(e,0,sizeof(int)*M);
MaxIntegerMul(c[3],c[1],d);
MaxIntegerMul(c[0],a,e);
MaxIntegerMul(d,e,b);
return ;
}
if(n==24){ MaxIntegerMul(c[3],c[2],b); return ;}
if(n==25){
int d[M]; memset(d,0,sizeof(int)*M);
MaxIntegerMul(c[3],c[2],d);
MaxIntegerMul(a,d,b);
return ;
}
}
int main()
{
//ifstream cin("2.txt");
int a[M]={0},b[M]={0};
char aa[10];
char resu[M]; //把大整数转换成字符串(计算结果)
int n;
while(cin>>aa>>n)
{
memset(a,0,sizeof(int)*M);
memset(b,0,sizeof(int)*M);
int len=strlen(aa);
int k=M-1;
int s=0; //记录小数点后有几位
bool flag=true;
for(int i=len-1;i>=0;i--)
{//把实数R去掉小数点当成整数存入a数组中
if(aa[i]!='.')
a[k--]=aa[i]-'0';
else flag=false;
if(flag) s++;
}
LargeIntegerExp(a,n,b);//计算a的n次方,结果存入b数组
int i;
for( i=0;i<M;i++)
if(b[i]) break;
int p=0;
for(int k=i;k<=M-1-s*n;k++)
resu[p++]=b[k]+'0';
resu[p++]='.';
for(int k=M-1-s*n+1;k<=M-1;k++)
resu[p++]=b[k]+'0';
resu[p]='\0';
len=strlen(resu);
for(int i=len-1;i>=0;i--) //去掉小数点后面多余的0
{
if(resu[i]=='0') resu[i]='\0';
else if (resu[i]=='.') { resu[i]='\0'; break;}
else break;
}
if(strlen(resu)==0) cout<<0<<endl;
cout<<resu<<endl;
}
//system("pause");
return 0;
}