#include "bits/stdc++.h" // Tomasz Nowak using namespace std; // University of Warsaw using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto& operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif struct Num { static constexpr int digits_per_elem = 9, base = int(1e9); vector<int> x; Num& shorten() { while(ssize(x) and x.back() == 0) x.pop_back(); for(int a : x) assert(0 <= a and a < base); return *this; } Num(const string& s) { for(int i = ssize(s); i > 0; i -= digits_per_elem) if(i < digits_per_elem) x.emplace_back(stoi(s.substr(0, i))); else x.emplace_back(stoi(s.substr(i - digits_per_elem, digits_per_elem))); shorten(); } Num() {} Num(LL s) : Num(to_string(s)) { assert(s >= 0); } }; string to_string(const Num& n) { stringstream s; s << (ssize(n.x) ? n.x.back() : 0); for(int i = ssize(n.x) - 2; i >= 0; --i) s << setfill('0') << setw(n.digits_per_elem) << n.x[i]; return s.str(); } ostream& operator<<(ostream &o, const Num& n) { return o << to_string(n).c_str(); } Num operator+(Num a, const Num& b) { int carry = 0; for(int i = 0; i < max(ssize(a.x), ssize(b.x)) or carry; ++i) { if(i == ssize(a.x)) a.x.emplace_back(0); a.x[i] += carry + (i < ssize(b.x) ? b.x[i] : 0); carry = bool(a.x[i] >= a.base); if(carry) a.x[i] -= a.base; } return a.shorten(); } int main() { cin.tie(0)->sync_with_stdio(0); string sa, sb; cin >> sa >> sb; Num a(sa), b(sb); cout << a + b << '\n'; }
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 70 71 72 73 74 75 76 77 | #include "bits/stdc++.h" // Tomasz Nowak using namespace std; // University of Warsaw using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto& operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif struct Num { static constexpr int digits_per_elem = 9, base = int(1e9); vector<int> x; Num& shorten() { while(ssize(x) and x.back() == 0) x.pop_back(); for(int a : x) assert(0 <= a and a < base); return *this; } Num(const string& s) { for(int i = ssize(s); i > 0; i -= digits_per_elem) if(i < digits_per_elem) x.emplace_back(stoi(s.substr(0, i))); else x.emplace_back(stoi(s.substr(i - digits_per_elem, digits_per_elem))); shorten(); } Num() {} Num(LL s) : Num(to_string(s)) { assert(s >= 0); } }; string to_string(const Num& n) { stringstream s; s << (ssize(n.x) ? n.x.back() : 0); for(int i = ssize(n.x) - 2; i >= 0; --i) s << setfill('0') << setw(n.digits_per_elem) << n.x[i]; return s.str(); } ostream& operator<<(ostream &o, const Num& n) { return o << to_string(n).c_str(); } Num operator+(Num a, const Num& b) { int carry = 0; for(int i = 0; i < max(ssize(a.x), ssize(b.x)) or carry; ++i) { if(i == ssize(a.x)) a.x.emplace_back(0); a.x[i] += carry + (i < ssize(b.x) ? b.x[i] : 0); carry = bool(a.x[i] >= a.base); if(carry) a.x[i] -= a.base; } return a.shorten(); } int main() { cin.tie(0)->sync_with_stdio(0); string sa, sb; cin >> sa >> sb; Num a(sa), b(sb); cout << a + b << '\n'; } |