第一次做高精度浮点数,着实费了番脑筋,不过终于AC了;
对于高精度运算还有一种分治方法能较少计算量,先留着链接
http://hi.baidu.com/foying/blog/item/3e00f6f87e214d08d9f9fddd.html
下面是参考别人后写的代码:
哎,写代码真是慢啊,给自己加油!希望有一天能成为学校那些厉害的ACMer中的一员!
#include"stdio.h"
int i,j,k,result[155],len=5;
int fpoint(char *s,int *r)
{
for(j=4,i=0;s[i]!='\0';i++)
if(s[i]!='.')r[j--]=s[i]-'0';
j=0;
while(s[j]!='.'&&s[j]!='\0')
j++;
return 5-j;
}
void multi(int *r,int n)
{
int i,j;
while(n-->1)
{
int c[155]={0};
for(i=0;i<5;i++)
for(j=0;j<len;j++)
c[i+j]+=r[i]*result[j];
len=i+j;
for(i=0;i<len;i++)
{
result[i]=c[i]%10;
c[i+1]+=c[i]/10;
}
}
return;
}
main()
{
int n,pstion,r[5]={0};
char s[7];
while(scanf("%s%d",s,&n)!=EOF)
{
if(n==0)printf("1");
else
{
pstion=fpoint(s,r);
for(i=0;i<5;i++)
result[i]=r[i];
multi(r,n);
pstion=n*pstion;
for(i=len-1,j=0;result[i]==0&&i>pstion-1;i--)
j++;
for(i=0,k=0;result[i]==0&&i<pstion;i++)
k++;
for(i=len-1-j;i>pstion-1;i--)
printf("%d",result[i]);
if(k!=pstion)printf(".");
for(i=pstion-1;i>=k;i--)
printf("%d",result[i]);
len=5;
}
printf("\n");
}
return 0;
}