原则
高精度数字的存储是用vector存储的,下标小的是低位,下标大的是高位。
高精度加法
t表示进位。
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() || t; i ++) {if (i < A.size()) {t += A[i];}if (i < B.size()) {t += B[i];}C.push_back(t % 10);t /= 10;}return C;}
高精度减法
这里的减法保证a > b。
代码里的borrow表示借位。
最后要去掉前导0。
bool cmp(vector<int>& a, vector<int>& b) {if (a.size() != b.size()) return a.size() > b.size();for (int i = (int) a.size() - 1; i >= 0; i --) {if (a[i] != b[i]) return a[i] > b[i];}return true;}vector<int> _minus(vector<int>& a, vector<int>& b) {vector<int> c;int borrow = 0;for (int i = 0; i < (int)a.size(); i ++) {int t = a[i] - borrow;if (i < (int)b.size()) {t = t - b[i];}if (t >= 0) {c.push_back(t);borrow = 0;} else {c.push_back(t + 10);borrow = 1;}}while (c.size() > 1 && c.back() == 0) {c.pop_back();}return c;}
高精度乘法
A是高精度整数,b是int型小整数。
需要去掉前导0(12345*0)。
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < (int)A.size() || t; i ++) {
if (i < (int)A.size()) {
t += A[i] * b;
}
C.push_back(t % 10);
t /= 10;
}
while(C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
高精度除法
高精度除法的计算顺序和加减乘是反的。因此最终答案要reverse一下。
需要去掉前导0。
vector<int> div(vector<int> &A, int b, int &r)
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i --) {
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while(C.size() > 1 && C.back() == 0) {
C.pop_back();
}
return C;
}
