题目链接地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1063
代码:
#include<stdio.h>
#include<string.h>
void multiply(char a[1000],char b[1000],char jj[1000]) //长整数乘法
{
int t1=strlen(a),t2=strlen(b),i,j,pos=0,flag=0,k;
int rr[1000];
memset(rr,0,sizeof(rr));
for(i=0;i<t1;i++)
for(j=0;j<t2;j++)
{
rr[i+j]+=(a[i]-48)*(b[j]-48);
rr[i+j+1]+=rr[i+j]/10;
rr[i+j]%=10;
}
k=t1+t2+1;
while(k>=0&&!rr[k])k--;
if(k<0)
{
rr[0]=0;
k=0;
}
for(j=0;j<=k;j++)jj[j]=rr[j]+48;
jj[k+1]='/0';
}
int main()
{
//freopen("1.in","r",stdin);
char r[10],m[10],jj[1000],tt[1000];
int n,i,j,pos,cc,len1,len2,l,k,pp,flag,point;
while(scanf("%s%d",r,&n)!=EOF)
{
pos=0;
flag=0;
for(i=0;i<=5;i++)
if(r[i]=='.')//判断有无小数点
{
flag=1;
point=i;
break;
}
if(flag) //有小数点
{
if(r[0]=='0')
{
i=0;
while(r[i]=='0')i++;
if(r[i]=='.')
{
i++;
k=5;
while(r[k]=='0')k--;
for(j=k;j>=i;j--)m[pos++]=r[j];
m[pos]='/0';
cc=k-i+1;
}
else if(r[i]<='9'&&r[i]>='1')
{
k=5;
while(r[k]=='0')k--;
cc=k-point;
for(pp=k;pp>=i;pp--)if(r[pp]!='.')m[pos++]=r[pp];
m[pos]='/0';
}
}
else
{
k=5;
while(r[k]=='0')k--;
for(i=k;i>=0;i--)
{
if(r[i]=='.')cc=k-i;
else m[pos++]=r[i];
}
m[pos]='/0';
}
}
else //无小数点
{
j=0;
while(r[j]=='0')j++;
for(i=5;i>=j;i--)m[pos++]=r[i];
cc=0;
m[pos]='/0';
}
strcpy(tt,m);
for(i=1;i<n;i++)
{
multiply(tt,m,jj);
strcpy(tt,jj);
}
len1=cc*n;
len2=strlen(tt);
if(len1>=len2)
{
printf(".");
for(i=1;i<=len1-len2;i++)printf("0");
for(i=len2-1;i>=0;i--)printf("%c",tt[i]);
printf("/n");
}
else
{
l=len2-len1;
for(i=len2-1;i>=0;i--)
{
printf("%c",tt[i]);
if(len2-1-i==l-1&&i)printf(".");
}
printf("/n");
}
}
return 0;
}