无聊水一道。。大数模拟
各种坑爹测试数据
#include "stdio.h"
#include "string.h"
int a[10010],b[10010],c[10010];
int main()
{
int w,i,j,m,dian,k,le;
char str[1001];
while (scanf("%s%d",&str,&w)!=EOF)
{
getchar();
if (w==0)
{
printf("1\n");
continue;
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
le=strlen(str);
m=1;
dian=-1;
for (i=le-1;i>=0;i--)
{
if (str[i]=='.') dian=m-1;
else
{
a[m]=str[i]-'0';
m++;
}
}
a[0]=m-1;
while (a[a[0]]==0) {a[0]--; if (a[0]==0) break;}
if (a[0]==0)
{
printf("0\n");
continue;
}
for (i=0;i<=a[0];i++)
b[i]=a[i];
for (i=2;i<=w;i++)
{
memset(c,0,sizeof(c));
for (j=1;j<=a[0];j++)
for (k=1;k<=b[0];k++)
c[j+k-1]+=a[j]*b[k];
c[0]=a[0]+b[0]-1;
for (j=1;j<=c[0];j++)
{
c[j+1]+=c[j]/10;
c[j]%=10;
}
if (c[c[0]+1]!=0) c[0]++;
while (c[c[0]]==0)
{
c[0]--;
}
for (j=0;j<=c[0];j++)
a[j]=c[j];
}
if (dian==-1)
{
for (i=a[0];i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
else
{
dian*=w;
if (a[0]<=dian)
{
printf(".");
for (i=1;i<=dian-a[0];i++)
printf("0");
k=1;
while(a[k]==0) k++;
for (i=a[0];i>=k;i--)
printf("%d",a[i]);
printf("\n");
}
else
{
for (i=a[0];i>dian;i--)
printf("%d",a[i]);
k=1;
while(a[k]==0) k++;
if (dian>=k) printf(".");
for (i=dian;i>=k;i--)
printf("%d",a[i]);
printf("\n");
}
}
}
return 0;
}