20.高精度的压位

加法可以压9位

乘法一般压4位,不压5位是因为会爆int

压8位的意思是:

  将高精度整数转化成数组时,数组中的每个数存储8位。这样数组的长度会缩小到原来的1/8。

压8位的具体实现:

  不压位的话,数组里每一个数存0~9。压8位就是每个数存0~99999999。这样数组长度会缩小到八分之一。

压位主要是省空间,时间效率略微加快

压位的本质就是不再以10进制来存

每次以1000000000进制来存

下面的代码是高精度加法压9位

题目同https://www.cnblogs.com/fx1998/p/12815214.html

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int base = 1000000000;
 4 vector<int> add(vector<int> &A, vector<int> &B) {
 5     vector<int> C;
 6     int t = 0;
 7     for (int i = 0; i < A.size() || i < B.size(); i++) {
 8         if (i < A.size()) {
 9             t += A[i];
10         }
11         if (i < B.size()) {
12             t += B[i];
13         }
14         C.push_back(t % base);
15         t /= base;
16     }
17     if (t) {
18         C.push_back(t);
19     }
20     return C;
21 }
22 int main() {
23     string a, b;
24     cin >> a >> b;
25     vector<int> A, B, C;
26     for (int i = a.length() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
27         //s是和,j是当前已经压了几位,t是每次乘的10
28         s += (a[i] - '0') * t;
29         j++;
30         t *= 10;
31         if (j == 9 || i == 0) {
32             A.push_back(s);
33             s = 0;
34             j = 0;
35             t = 1;
36         }
37     }
38     for (int i = b.length() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
39         s += (b[i] - '0') * t;
40         j++;
41         t *= 10;
42         if (j == 9 || i == 0) {
43             B.push_back(s);
44             s = 0;
45             j = 0;
46             t = 1;
47         }
48     }
49     C = add(A, B);
50     cout << C.back();
51     for (int i = C.size() - 2; i >= 0; i--) {
52         //printf("%09d", C[i]);
53         cout << setw(9) << setfill('0') << C[i];
54     }
55     return 0;
56 }
原文地址:https://www.cnblogs.com/fx1998/p/13235988.html