概念

当学完C++语言部分的知识后,可以学习一下高精度习题,锻炼一下自己对一维数组的理解,提高自己的代码能力。相信我,如果你不是抄代码的,你将写得怀疑人生。(这个地方写的时候,真的挺容易写错)

主要的思想是利用竖式加减乘除的原理,进行模拟。这块一般是背模板理解,有用string读入转vector的,有直接用一维数组处理的。在理解原理上,vector的模板好理解。在实际使用中,一维数组的使用更加常见。

现在的考试基本不单纯考高精度,很早之前省选有一次考的高精除法,结果只有很少人写对,然而题目区分度却被diss。现在都基本开LL过部分分,或者会取模,避免高精。普及组里如果遇到高精度,可能现场也不太会写高精,需要比较强的代码能力。

高精度加法

  1. // C = A + B, A >= 0, B >= 0
  2. vector<int> add(vector<int> &A, vector<int> &B)
  3. {
  4. if (A.size() < B.size()) return add(B, A);
  5. vector<int> C;
  6. int t = 0;
  7. for (int i = 0; i < A.size(); i ++ )
  8. {
  9. t += A[i];
  10. if (i < B.size()) t += B[i];
  11. C.push_back(t % 10);
  12. t /= 10;
  13. }
  14. if (t) C.push_back(t);
  15. return C;
  16. }
  1. //一维数组版本
  2. void add(int A[], int B[], int C[])
  3. {
  4. int t = 0;
  5. for (int i = 0; i <= lena || i <= lenb; i++)
  6. {
  7. if (i <= lena) t += A[i];
  8. if (i <= lenb) t += B[i];
  9. C[lenc++] = t % 10;
  10. t /= 10;
  11. }
  12. if (t) C[lenc] = 1;
  13. while (lenc > 0 && C[lenc] == 0) lenc--;
  14. for (int i = lenc; i >= 0; i--) cout << C[i];
  15. puts("");
  16. }

例题:1168:大整数加法

  1. // 1.使用vector<> 的模板实现,读入string后,要倒序处理一下
  2. // 2.使用一维数组的方式实现
  3. // 输入的数据,可能有多余的前导零