考点
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <bits/stdc++.h>
using namespace std;
const int LEN = 5050;
class BigInt { public: int len_; int arr_[LEN]; int &operator[](int idx) { return arr_[idx]; } BigInt(string s = "") { memset(arr_, 0, sizeof(arr_)); len_ = s.length(); for (int i = 1; i <= len_; ++i) { arr_[i] = s[len_ - i] - '0'; } } void flatten(int len) { len_ = len; for (int i = 1; i <= len_; ++i) { if (arr_[i] >= 10) { arr_[i + 1] += arr_[i] / 10; arr_[i] %= 10; } } while (!arr_[len_]) --len_; } void print() { for (int i = max(1, len_); i >= 1; --i) { cout << arr_[i]; } } };
BigInt operator+(BigInt a, BigInt b) { BigInt c; int len = max(a.len_, b.len_); for (int i = 1; i <= len; ++i) { c[i] += a[i] + b[i]; } c.flatten(len + 1); return c; }
int main() { string a, b; cin >> a >> b; (BigInt(a) + BigInt(b)).print(); return 0; }
|
思路
为了方便处理,先将两个操作数反转,然后再按位进行运算
BigInt
的构造函数就是将字符串逆序保存至数组
print
函数则是从尾到头输出数组,这样结果就是正序的;当然,print
函数要处理一下数组只有0的情况
由于存在进位,所以需要flatten
函数处理每一位