20.高精度的压位

Posted fx1998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(1);
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     }
54     return 0;
55 }

 

以上是关于20.高精度的压位的主要内容,如果未能解决你的问题,请参考以下文章

高精度压位

codevs 3119 高精度练习之大整数开根 (各种高精+压位)

刷题总结——regular words(hdu1502 dp+高精度加法+压位)

[SDOI2009]SuperGCD 压位高精度+辗转相减

用到了卡特兰数的性质,还有高精度压位,筛法找素数

高精度程序(高-高/高-低,变量步骤尽可能的少的使用,初始化0的分析,压位)