Sample Input
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
这个题的意思是给出几组数,每组一个小数和一个整数,要求求出小数的整数次方,
相当于大数乘法加上小数点进位,不过由于一些特殊的数和补零的问题,WA了好几发T^T
代码中的两个自定义函数意思差不多,不过适用于不同的情况,由于改了好几次,可能代码有些赘余。。。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
string s;
char a[20005];
int l[20005],m[20005],mmp[20005];
int len,z;
void mdltxdy(int l[],int m[])
{
memset(mmp,0,sizeof(mmp));
for(len=20000; l[len]==0; len--);
for(int i=0; i<=len; i++)
{
for(int j=0; j<z-1; j++)
{
mmp[i+j]+=l[i]*m[j];
}
}
for(int i=0; i<20000; i++)
{
if(mmp[i]>=10)
{
mmp[i+1]+=mmp[i]/10;
mmp[i]%=10;
}
l[i]=mmp[i];
}
}
void cmttxdy(int l[],int m[])
{
memset(mmp,0,sizeof(mmp));
for(len=20000;l[len]==0;len--);
for(int i=0;i<=len;i++)
{
for(int j=0;j<z;j++)
{
mmp[i+j]+=l[i]*m[j];
}
}
for(int i=0;i<20000;i++)
{
if(mmp[i]>=10)
{
mmp[i+1]+=mmp[i]/10;
mmp[i]%=10;
}
l[i]=mmp[i];
}
//printf("%d ",l[0]);
}
int main()
{
int k;
int flag3;
while(cin>>s>>k)
{
flag3=0;
if(s.find('.')!=-1)
{
int x=0,y;
z=s.size();
for(int i=0; i<z; i++)
{
if(s[i]=='.')
{
y=z-1-i;
continue;
}
a[x++]=s[i];
}/*for(int i=0;i<100;i++)
printf("%c",a[i]);*/
for(int i=0; i<z-1; i++)
{
l[i]=a[z-2-i]-'0';
m[i]=a[z-2-i]-'0';
if(l[i]!=0)
{
flag3=1;
}
}
if(flag3==0)
{
printf("0\n");
continue;
}
//puts("");
for(int i=0; i<k-1; i++)
{
mdltxdy(l,m);
}
int cnm=20005;
int flag1=0;
for(; l[flag1]==0&&flag1<k*y; flag1++);
for(; l[cnm]==0; cnm--);
if(cnm>=k*y)
{
for(int i=cnm; i>=flag1; i--)
{
printf("%d",l[i]);
if(i==k*y&&flag1!=k*y)
printf(".");
}
printf("\n");
}
else
{
printf(".");
for(int i=0; i<k*y-cnm-1; i++)
printf("%d",0);
for(int i=cnm; i>=flag1; i--)
{
printf("%d",l[i]);
}
printf("\n");
}
}
else
{
int x=0,y;
z=s.size();
for(int i=0; i<z; i++)
{
a[x++]=s[i];
}
for(int i=0; i<z; i++)
{
l[i]=a[z-1-i]-'0';
m[i]=a[z-1-i]-'0';
if(l[i]!=0)
{
flag3=1;
}
}
if(flag3==0)
{
printf("0\n");
continue;
}
for(int i=0;i<k-1;i++)
{
cmttxdy(l,m);
}
int flag2=20000;
for(;l[flag2]==0;flag2--);
for(int i=flag2;i>=0;i--)
{
printf("%d",l[i]);
}
puts("");
}
s.clear();
memset(l,0,sizeof(l));
memset(m,0,sizeof(m));
}
return 0;
}