20191114 | 高精度

高精度板子:

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 using namespace std;
  5 struct node
  6 {
  7     static const int M = 10000;
  8     int num[M+10],len;
  9     node(){clean();}
 10     void clean()
 11     {
 12         memset(num,0,sizeof(num));
 13         len = 1;
 14     }
 15     void read()
 16     {
 17         char s[M+10];
 18         scanf("%s",s);
 19         len = strlen(s);
 20         for(int i = 1;i <= len;i ++)num[i] = s[len - i] - '0';
 21     }
 22     void write()
 23     {
 24         for(int i = len;i >= 1;i --)printf("%d",num[i]);
 25     }
 26     friend bool operator < (node a,node b)
 27     {
 28         if(a.len != b.len)return a.len < b.len;
 29         for(int i = a.len;i >= 1;i --)if(a.num[i] != b.num[i])return a.num[i] < b.num[i];
 30         return 0;
 31     }
 32     friend bool operator > (node a,node b)
 33     {
 34         return b < a;
 35     }
 36     friend bool operator <= (node a,node b)
 37     {
 38         return !(b > a);
 39     }
 40     friend bool operator >= (node a,node b)
 41     {
 42         return !(a < b);
 43     }
 44     friend bool operator != (node a,node b)
 45     {
 46         return a < b || b < a;
 47     }
 48     friend bool operator == (node a,node b)
 49     {
 50         return !(a < b || b < a);
 51     }
 52     friend node operator + (node a,node b)
 53     {
 54         node s;
 55         s.len = max(a.len,b.len);
 56         for(int i = 1;i <= s.len;i ++)
 57         {
 58         s.num[i] += a.num[i] + b.num[i];
 59         s.num[i+1] = s.num[i] / 10;
 60         s.num[i] %= 10;
 61         }
 62         while(s.num[s.len + 1])s.len ++;
 63         return s;
 64     }
 65     friend node operator - (node a,node b)
 66     {
 67         node s;
 68         s.len = max(a.len,b.len);
 69         for(int i = 1;i <= s.len;i ++)
 70         {
 71         s.num[i] += a.num[i] - b.num[i];
 72         if(s.num[i]<0)
 73         {
 74             s.num[i] += 10;
 75             s.num[i+1]--;
 76         }
 77         }
 78         while(!s.num[s.len]&&s.len > 1)s.len --;
 79         return s;
 80     }
 81     friend node operator * (node a,node b)
 82     {
 83         node s;
 84         if((b.len == 1 && b.num[1] == 0) || (a.len == 1 && a.num[1] == 0))return s;
 85         s.len = a.len + b.len - 1;
 86         for(int i = 1;i <= a.len; i++)
 87         {
 88         for(int j = 1;j <= b.len;j ++)
 89         {
 90             s.num[i+j-1] += a.num[i] * b.num[j];
 91             s.num[i+j] += s.num[i+j-1]/10;
 92             s.num[i+j-1] %= 10;
 93         }
 94 
 95            
 96         }
 97         while(s.num[s.len+1])s.len ++;
 98         return s;
 99     }
100     void tonode(int x)
101     {
102         clean();
103         while(x)
104         {
105         num[len++] = x % 10;
106         x /= 10;
107         }
108         if(len != 1)len --;
109     }
110     friend node operator / (node a,node b)
111     {
112         node s;
113         if((b.len == 1 && b.num[1] == 0) || (a.len == 1 && a.num[1] == 0))return s;
114         node r,n;
115         s.len = 0;
116         for(int i = a.len;i >= 1;i --)
117         {
118         n.tonode(10);
119         r = r * n;
120         n.tonode(a.num[i]);
121         r = r + n;
122         int f = 0;
123         for(int j = 1;j <= 10;j ++)
124         {
125             n.tonode(j);
126             if(n * b > r)
127             {
128             f = j - 1;
129             break;
130             }
131         }
132         s.num[++s.len] = f;
133         n.tonode(f);
134         r = r - n * b;
135         }
136         for(int i = 1;i <= s.len / 2;i ++)
137         {
138         swap(s.num[i],s.num[s.len-i+1]);
139         }
140         while(!s.num[s.len] && s.len > 1)s.len --;
141         if(!s.len)
142         {
143         s.len = 1;
144         s.num[1] = 0;
145         }
146         return s;
147     }
148     friend node operator % (node a,node b)
149     {
150         node s;
151         node p = a / b;
152         s = a - p * b;
153         return s;
154     }
155 };
156 int main()
157 {
158     node a,b;
159     a.read();
160     b.read();
161     node c;
162     c = a + b;
163     c.write();
164     putchar('\n');
165     c = a - b;
166     c.write();
167     putchar('\n');
168     c = a * b;
169     c.write();
170     putchar('\n');
171     c = a / b;
172     c.write();
173     putchar('\n');
174     c = a % b;
175     c.write();
176     putchar('\n');
177     return 0;
178 }

 

posted @ 2019-11-14 17:41  djfuuxjz  阅读(18)  评论(0编辑  收藏  举报