以前百练写过,贼麻烦。。
转一个http://www.cnblogs.com/penseur/archive/2011/02/16/1956046.html
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
//大数相乘
string multiply(string str1,string str2)
{
char source[300][1000];
int len[300]={0};
if(str1=="0"||str2=="0")
{
return "0";
}
memset(source,'0',sizeof(source));
for(int i=0;i<300;i++)
len[i]=0;
char midstr1[300];
char midstr2[300];
int mstr1p=0;
int mstr2p=0;
memset(midstr1,'0',sizeof(midstr1));
memset(midstr2,'0',sizeof(midstr2));
int str1len=str1.size();
int str2len=str2.size();
for(int i=str1len-1;i>=0;i--)
midstr1[mstr1p++]=str1[i];
for(int i=str2len-1;i>=0;i--)
midstr2[mstr2p++]=str2[i];
//cout<<midstr1<<midstr2<<endl;
int space=0;
for(int i=0;i<mstr2p;i++)
{
char c=midstr2[i];
int addtion=0;
int d=c-'0';
int space=i;
for(int j=0;j<mstr1p;j++)
{
int one=midstr1[j]-'0';
int midmult=one*d+addtion;
addtion=midmult/10;
source[i][space++]=midmult%10+'0';
}
if(addtion>0)
source[i][space++]=addtion+'0';
len[i]=space;
}
//数值初始化完毕进行累加
char sum[1000];
memset(sum,'0',sizeof(sum));
int point=mstr2p-1;
int pflag=0;
int longs=0;
for(int i=899;i>=0;i--)
{
if(pflag)
{
sum[i]=source[point][i];
}
else
{
if(source[point][i]!='0')
{
pflag=1;
longs=i;
sum[i]=source[point][i];
}
}
}
for(int i=0;i<point;i++)
{
int addtion=0;
for(int j=0;j<len[i];j++)
{
int one=source[i][j]-'0';
int midsum=one+addtion+sum[j]-'0';
addtion=midsum/10;
sum[j]=midsum%10+'0';
}
if(addtion>0)
{
for(int k=len[i];k<1000;k++)
{
int midsum=sum[k]-'0'+addtion;
addtion=midsum/10;
sum[k]=midsum%10+'0';
if(addtion==0)
break;
}
}
}
char copysm[10000];
int cp=0;
memset(copysm,0,sizeof(copysm));
int flag=0;
for(int i=longs+12;i>=0;i--)
{
if(flag)
copysm[cp++]=sum[i];
else
{
if(sum[i]!='0')
{
flag=1;
copysm[cp++]=sum[i];
}
}
}
string str(copysm);
return str;
}
// 删除前导零。
void delLeadZero(string & a)
{
int i = 0;
while (a[i] == '0') i++;
if (i == a.size()) a = "0";
else a = a.substr(i, a.size() - i);
}
int main()
{
string str;
while(getline(cin,str))
{
string left=str.substr(0,6);
string right=str.substr(7);
int nright=right[1]-'0';
if(right[0]!=' ')
nright=(right[0]-'0')*10+nright;
int pos=left.find('.');
int len=5-pos;
left.replace(pos,1,"");
delLeadZero(left);
string powers=left;
for(int i=0;i<nright-1;i++)
{
powers=multiply(powers,left);
}
int span=len*nright;
int plen=powers.size();
if(span<plen)
{
int st=plen-span;
powers.insert(st,".");
}
else
{
int st=span-plen;
cout<<".";
for(int i=0;i<st;i++)
cout<<"0";
}
deltrailZero(powers);
cout<<powers<<endl;
}
return 0;
}