POJ1001

高精度小数乘法,要注意0.xxxx输出的时候是.xxxx,以及考虑0的情况

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N_MAX=100000;
 8 struct Tnum{
 9     int bt[N_MAX],len,pt;
10     Tnum(){ len=pt=0; memset(bt,0,sizeof(bt)); }
11     int operator[](const int &p)const{ return bt[p]; }
12     void clear(){ len=pt=0; memset(bt,0,sizeof(bt)); }
13     int read(){
14         clear();
15         char ch=getchar();
16         if (ch=='.') bt[++len]=0;
17         else{
18             while ('0'>ch || ch>'9'){
19                 if (ch==EOF) return 1;
20                 ch=getchar();
21             }
22         }
23         while ('0'<=ch && ch<='9') bt[++len]=ch-'0',ch=getchar();
24         pt=len; if (ch==' ') return 0; ch=getchar();
25         while ('0'<=ch && ch<='9') bt[++len]=ch-'0',ch=getchar();
26         return 0;
27     }
28     void print(){
29         if (pt==1 && !bt[1]){
30             putchar('.');
31             for (int i=pt+1; i<=len; ++i) putchar('0'+bt[i]);
32             printf("\n");
33             return;
34         }
35         for (int i=1; i<=pt; ++i) putchar('0'+bt[i]);
36         if (pt==len){
37             printf("\n");
38             return;
39         }
40         putchar('.');
41         for (int i=pt+1; i<=len; ++i) putchar('0'+bt[i]);
42         printf("\n");
43     }
44     void maintain(){
45         for (int i=2; i<=len; ++i) if (bt[i]>=10) bt[i-1]+=bt[i]/10,bt[i]%=10;
46         while (!bt[len] && len>pt) --len;
47         while (!bt[1] && pt>1){
48             for (int i=1; i<=len; ++i) bt[i]=bt[i+1];
49             --pt; --len;
50         }
51     }
52 }a,b,c;
53 int n;
54 void work(){
55     scanf("%d", &n);
56     a.maintain();b.clear();b=a;//printf("b=");b.print();
57     if (!a[1] && a.len==1 && a.pt==1 && !n){ printf("1\n");return; }
58     if (!a[1] && a.len==1 && a.pt==1){ printf("0\n");return; }
59     if (!n){ printf("1\n");return; }
60     int tmp,x;
61     for (; n>=2; --n){
62         c.clear(); tmp=x=0; c.len=a.len+b.len; c.pt=a.pt+b.pt;
63         for (int i=b.len; i>=1; --i){
64             x=0;
65             for (int j=a.len; j>=1; --j){
66                 tmp=a[j]*b[i];
67                 c.bt[i+j]+=(tmp%10)+x;
68                 x=tmp/10;
69                 if (c.bt[i+j]>=10){ x+=(c.bt[i+j]/10);c.bt[i+j]%=10; }
70                 //printf("tmp=%d x=%d\n", tmp, x);
71             }
72             if (x) c.bt[i]+=x;
73         }
74         //printf("c="); c.print(); printf("c.len=%d c.pt=%d\n", c.len, c.pt);
75         a=c;
76     }
77     a.maintain();a.print();
78 }
79 int main(){
80     //freopen("input","r",stdin);
81     //freopen("output","w",stdout);
82     while (!a.read()) work();
83     return 0;
84 }
View Code

 

posted @ 2016-07-25 22:19  J_Harden  阅读(135)  评论(0)    收藏  举报