#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int ans[200];
int intstr[7];
int totallen=1;
void cal(int n)
{
int i,j;
int a[200];
memset(a,0,sizeof(a));
for(i=0;i<n;++i)
{
for(j=0;j<=totallen;++j)
{
a[j+i]+=ans[j]*intstr[i];
}
for(j=0;j<=totallen+i;++j)
{
if(a[j]>=10)
{
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
}
}
if(a[totallen+i]!=0) //两个数相乘,最高存储位为是i+j-1,判断其最高位是否有进位决定ans的有效数字长度
totallen=totallen+i;
else
totallen=totallen+i-1;
for(i=0;i<=totallen;++i)
ans[i]=a[i];
}
int main()
{
char str[7];
int n;
while(scanf("%s%d",str,&n)!=EOF)
{
int len=strlen(str);
int ptlen=0;
int i,j;
i=j=0;
ans[0]=1; totallen=0;
i=len-1; //存放数时应该倒过来,即高低位数位置匹配
while(i>=0)
{
if(str[i]!='.')
intstr[j++]=str[i]-48;
i--;
}
i=0;
bool point=false;
while(str[i])
{
if(str[i]=='.')
{
ptlen=len-i-1;
len--;
point=true; //判断是否有小数点
break;
}
i++;
}
for(i=0;i<n;++i) //乘法模拟
cal(len);
int ptpos=ptlen*n;
if(point==true)
{
for(i=0;i<=ptpos-1;++i) //如果有小数点,那么小数点后位于最后一块的0全部不要打印
if(ans[i]!=0)
break;
}
int bottom=i;
bool isPrint=false;
if(totallen==ptpos&&ans[totallen]==0) //最高位为0时,不打印
totallen-=1;
for(i=totallen;i>=bottom;i--)
if(i==ptpos-1&&!isPrint)
{
printf(".");
isPrint=true;
i++;
}
else
printf("%d",ans[i]);
printf("\n");
}
}
POJ 1001
最新推荐文章于 2019-12-01 23:05:10 发布