概念
当学完C++语言部分的知识后,可以学习一下高精度习题,锻炼一下自己对一维数组的理解,提高自己的代码能力。相信我,如果你不是抄代码的,你将写得怀疑人生。(这个地方写的时候,真的挺容易写错)
主要的思想是利用竖式加减乘除的原理,进行模拟。这块一般是背模板理解,有用string读入转vector的,有直接用一维数组处理的。在理解原理上,vector的模板好理解。在实际使用中,一维数组的使用更加常见。
现在的考试基本不单纯考高精度,很早之前省选有一次考的高精除法,结果只有很少人写对,然而题目区分度却被diss。现在都基本开LL过部分分,或者会取模,避免高精。普及组里如果遇到高精度,可能现场也不太会写高精,需要比较强的代码能力。
高精度加法
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
//一维数组版本
void add(int A[], int B[], int C[])
{
int t = 0;
for (int i = 0; i <= lena || i <= lenb; i++)
{
if (i <= lena) t += A[i];
if (i <= lenb) t += B[i];
C[lenc++] = t % 10;
t /= 10;
}
if (t) C[lenc] = 1;
while (lenc > 0 && C[lenc] == 0) lenc--;
for (int i = lenc; i >= 0; i--) cout << C[i];
puts("");
}
例题:1168:大整数加法
// 1.使用vector<> 的模板实现,读入string后,要倒序处理一下
// 2.使用一维数组的方式实现
// 输入的数据,可能有多余的前导零