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 高精度练习之大整数开根 (各种高精+压位)