vector<int> add(const vector<int> &A, const vector<int> &B){ vector<int> res; int c = 0; // 进位 for (int i = 0; i < A.size(); i++) { c += A[i]; if (i < B.size()) { c += B[i]; } res.push_back(c % 10); c /= 10; } if (c != 0) res.push_back(c); return res; }
减法
两个高精度数 A 和 B ( A - B , A >= B )相减,采用由低位逐位模拟借位减法的方式计算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
vector<int> sub(const vector<int> &A, const vector<int> &B){ vector<int> res = 0; int c = 0; // 借位 for (int i = 0; i < A.size(); i++) { c = A[i] - c; if (i < B.size()) { c -= B[i]; } res.push_back((c + 10) % 10); if (c < 0) c = 1; else c = 0; } while (res.size() > 1 && res.back() == 0) { res.pop_back(); } return res; }
由于存在有借位减的情况,为了每次减后为了保证结果为正数,需要 (c + 10) % 10 。
乘法
不同于前面逐位模拟的加减法,高精度数 A 乘整型 b ,将整型看做一个整体,逐位将 A[i] 乘 b ,并与当前和相加取模得到当前位的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13
vector<int> mul(const vector<int> &A, int b){ vector<int> res; int c = 0; for (int i = 0; i < A.size() || c != 0; i++) { if (i < A.size()) c += A[i] * b; res.push_back(c % 10); c /= 10; } while (res.size() > 1 && res.back() == 0) { res.pop_back(); } return res; }
这里的代码同前面的高精度加减存在有两个不同点,一是乘法的结果长度可能大于高精度数 A 的长度,因此循环时不仅要判断 A.size() 也要判断当前乘积 c 是否为 0 ,二是乘法可能会出现前导 0 ,在输出时需要去除。
除法
高精度数 A 除整型 b ,采用由高位逐位模拟的试除法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
vector<int> div(const vector<int> &A, int b){ vector<int> res; int c = 0; for (int i = A.size() - 1; i >= 0; i--) { c = c * 10 + A[i]; res.push_back(c / b); c %= b; } reverse(res.begin(), res.end()); while (res.size() > 1 && res.back() == 0) { res.pop_back(); } return res; }