天天看点

POJ1001 Exponentiation 高精度

第一次做高精度浮点数,着实费了番脑筋,不过终于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; 
} 
           
c