高精度(二):vector实现¶
前置知识¶
vector,函数,模拟
目标¶
用函数实现高精度加、减、乘、除
高精度数字仍然采用倒序存储。
去掉前导零¶
比较大小¶
int cmp(vector<int> A, vector<int> B) {
if (A.size() != B.size())
return A.size() > B.size() ? 1 : -1;
for (int i = A.size() - 1; i >= 0; i--)
if (A[i] != B[i])
return A[i] > B[i] ? 1 : -1;
return 0;
}
高精加高精¶
vector<int> add(vector<int> A, vector<int> B) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || i < B.size(); i++) {
if (i < A.size()) 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;
}
高精减高精¶
要求 A >= B。
vector<int> sub(vector<int> A, vector<int> B) {
vector<int> C;
for (int i = 0, t = 0; i < A.size(); i++) {
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
clear(C);
return C;
}
高精乘低精¶
vector<int> mul(vector<int> A, int b) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++) {
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
clear(C);
return C;
}
高精乘高精¶
vector<int> mul(vector<int> A, vector<int> B) {
vector<int> C(A.size() + B.size() + 1);
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < B.size(); j++)
C[i + j] += A[i] * B[j];
for (int i = 0; i + 1 < C.size(); i++) {
C[i + 1] += C[i] / 10;
C[i] %= 10;
}
clear(C);
return C;
}
高精除低精¶
计算:
vector<int> div(vector<int> A, int b, int &r) {
vector<int> C(A.size());
r = 0;
for (int i = A.size() - 1; i >= 0; i--) {
r = r * 10 + A[i];
C[i] = r / b;
r %= b;
}
clear(C);
return C;
}
高精除高精¶
vector<int> div(vector<int> A, vector<int> B) {
vector<int> C(A.size());
vector<int> R(1, 0);
for (int i = A.size() - 1; i >= 0; i--) {
R.insert(R.begin(), A[i]);
clear(R);
while (cmp(R, B) >= 0) {
R = sub(R, B);
C[i]++;
}
}
clear(C);
return C;
}
总结¶
vector版本重点:
- 不需要手动维护长度
- 运算写成独立函数
- 高精除高精需要比较和减法