#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'; } |
English