原则
高精度数字的存储是用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;
}