高精度 模板 压代码 精简版

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 struct bign{
 6     int len;
 7     int num[1501];
 8     bool flag;
 9     bign(){len=1;flag=0;memset(num,0,sizeof num);}
10     bign(int x){
11         if(!x)return;
12         len=0;
13         while(x)num[++len]=x%10;x/=10;
14     }
15 };
16 bool operator < (bign a,bign b){
17     if(a.len<b.len)return 1;
18     if(a.len>b.len)return 0;
19     for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0;
20     return 1;
21 }
22 bool operator == (bign a,bign b){
23     if(a.len!=b.len)return 0;
24     for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
25     return 1;
26 }
27 bign operator + (bign a,bign b){
28     bign ans;
29     int i=1,x=0;
30     while(i<=a.len || i<=b.len){
31         ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
32         x=ans.num[i]/10;ans.num[i]%=10;  i++;
33     }
34     ans.num[i]=x;
35     if(!ans.num[i])i--;
36     ans.len=i;
37     return ans;
38 }
39 bign operator * (bign a,bign b){
40     bign ans;
41     int len=a.len+b.len;
42     for(int i=1;i<=a.len;i++){
43         int x=0;
44         for(int j=1;j<=b.len;j++){
45             ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
46             x=ans.num[i+j-1]/10;
47             ans.num[i+j-1]%=10;
48         }
49         ans.num[i+b.len]+=x;
50     }
51     while(!ans.num[len] && len>1)len--;
52     ans.len=len;
53     return ans;
54 }
55 bign operator - (bign a,bign b){
56     bign ans;
57     if(a==b)return ans;
58     if(b<a){
59         for(int i=1;i<=a.len;i++){
60             if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
61             ans.num[i]=a.num[i]-b.num[i];
62             if(ans.num[i]<0){
63                 ans.num[i]+=10; a.num[i+1]--;//向a的高位借位
64             }
65         }
66     }
67     else{
68         ans.flag=1;// this number(I mean the ans) is smaller than zero
69         for(int i=1;i<=b.len;i++){
70             if(b.num[i]<0){
71                 b.num[i]+=10; b.num[i+1]--;
72             }
73             ans.num[i]=b.num[i]-a.num[i];
74             if(ans.num[i]<0){
75                 ans.num[i]+=10; b.num[i+1]--;
76             }
77         }
78     }
79     int len=max(a.len,b.len);
80     while(ans.num[len]<=0 && len>1)len--;
81     ans.len=len;
82     return ans;
83 }

 

posted @ 2014-11-04 07:52  Skyvot  阅读(858)  评论(0编辑  收藏  举报