/** 大数(高精度)求幂 **/
//输入两个数字 m(可以带小数点),n,求m的n次方
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char multiply[1000];
void multiplyer(char *a,char *b) //实质上就是俩个整型大数的乘法
{
int i,j,num,tem;
int multy[1000]= {0};
for(i=strlen(a)-1; i>=0; i--)
for(j=strlen(b)-1,tem=strlen(a)-1-i; j>=0; j--,tem++)
{
num=(a[i]-'0'+0)*(b[j]-'0'+0)+multy[tem];
multy[tem]=num%10;
multy[tem+1]+=num/10;
}
for(i=999; i>=0; i--)
if(multy[i])
break;
for(j=0; i>=0; i--)
multiply[j++]=multy[i]+'0';
}
int main()
{
char a[10];
int b,i,fcount,num,flag;
while(scanf("%s %d",a,&b)!=EOF)
{
memset(multiply,0,sizeof(multiply));
for(i=0,num=0; i<=strlen(a)-1; i++)
if(a[i]=='.') //需记录浮点数所在的位数
{
fcount=strlen(a)-1-i;
for(; i<=strlen(a)-1; i++)
a[i]=a[i+1];
num=fcount*b; //记录小数点后数字的位数
break;
}
for(i=0; i<=strlen(a)-1; i++)
if(a[i]!='0')
break;
for(fcount=0; i<=strlen(a); i++)
a[fcount++]=a[i];
strcpy(multiply,a);
b=b-1;
while(b--)
multiplyer(multiply,a);
if(num<=strlen(multiply)) //根据补小数点的位置,需分情况讨论
{
for(i=strlen(multiply)-1; i>=0; i--)
if(multiply[i]!='0')
{
flag=i;
break;
}
for(i=0; i<=strlen(multiply)-1; i++)
{
printf("%c",multiply[i]);
if(i==strlen(multiply)-num-1) //浮点数求幂在相应位置上补小数点
{
if(i==flag) //判断若是整数的幂次方,则不需要输出小数点而直接跳出
break;
printf(".");
}
if(flag==i)
break;
}
}
else //若num>multily的位数,需要在小数点后补足相应位数的零
{
for(i=strlen(multiply)-1; i>=0; i--)
if(multiply[i]!='0')
{
multiply[i+1]='\0';
break;
}
printf(".");
for(i=strlen(multiply); i<=num-1; i++)
printf("0");
printf("%s",multiply);
}
puts("");
}
return 0;
}