문제

링크

풀이

#include <iostream>
#include <string>
using namespace std;
 
class BigNum {
public:
  string num;
 
private:
  static string trim(string &s) {
    int idx = s.find_first_not_of('0');
    return idx != string::npos ? s.substr(idx) : "0";
  }
 
  static void padding(string &a, string &b) {
    if (a.length() < b.length()) a.insert(0, string(b.length() - a.length(), '0'));
    if (a.length() > b.length()) b.insert(0, string(a.length() - b.length(), '0'));
  }
 
  static string add(string a, string b) {
    if (a.length() <= 18 && b.length() <= 18) {
      return to_string(stoll(a) + stoll(b));
    }
    padding(a, b);
 
    string c = "";
    int carry = 0, sum = 0;
    for (int i = a.length() - 1; i >= 0; --i) {
      sum = (a[i] - '0') + (b[i] - '0') + carry;
      carry = sum / 10;
      c.insert(0, 1, (char)(sum % 10 + '0'));
    }
    if (carry) c.insert(0, 1, (char)(carry + '0'));
 
    return trim(c);
  }
  
public:
  BigNum(void) : num("0") {}
  BigNum(const string &s) : num(s) {}
 
  friend istream &operator>>(istream &is, BigNum &bn) {
    string s;
    is >> s;
    bn = BigNum(s);
    return is;
  }
 
  friend ostream &operator<<(ostream &os, const BigNum &bn) {
    os << bn.num;
    return os;
  }
 
  BigNum operator+(const BigNum &bn) const {
    return BigNum(add(this->num, bn.num));
  }
};
 
void solve(void) {
  BigNum a, b;
  cin >> a >> b;
  cout << a + b;
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}