不多比比,直接上模板
#include<bits/stdc++.h>
//大整数
struct BigInteger {
static const int BASE = 100000000;//和WIDTH保持一致
static const int WIDTH = 8;//八位一存储,如修改记得修改输出中的%08d
bool sign;//符号, 0表示负数
size_t length;
std::vector<int> num;//反序存
//构造函数
BigInteger(long long x = 0) { *this = x; }
BigInteger(const std::string &x) { *this = x; }
BigInteger(const BigInteger &x) { *this = x; }
//剪掉前导0
void cutLeadingZero() {
while (num.back() == 0 && num.size() != 1) { num.pop_back(); }
}
//设置数的长度
void setLength() {
cutLeadingZero();
int tmp = num.back();
if (tmp == 0) { length = 1; }
else {
length = (num.size() - 1) * WIDTH;
while (tmp > 0) {
++length;
tmp /= 10;
}
}
}
//赋值运算符
BigInteger &operator=(long long x) {
num.clear();
if (x >= 0) sign = true;
else {
sign = false;
x = -x;
}
do {
num.emplace_back(x % BASE);
x /= BASE;
} while (x > 0);
setLength();
return *this;
}
//赋值运算符
BigInteger &operator=(const std::string &str) {
num.clear();
sign = (str[0] != '-');//设置符号
int x, len = (str.size() - 1 - (!sign)) / WIDTH + 1;
for (int i = 0; i < len; i++) {
int End = str.length() - i * WIDTH;
int start = std::max((int) (!sign), End - WIDTH);//防止越界
sscanf(str.substr(start, End - start).c_str(), "%d", &x);
num.push_back(x);
}
setLength();
return *this;
}
//赋值运算符
BigInteger &operator=(const BigInteger &tmp) {
num = tmp.num;
sign = tmp.sign;
length = tmp.length;
return *this;
}
//数的位数
size_t size() const { return length; }
//*10^n 除法中用到
BigInteger e(size_t n) const {
int tmp = n % WIDTH;
BigInteger ans;
ans.length = n + 1;
n /= WIDTH;
while (ans.num.size() <= n) ans.num.push_back(0);
ans.num[n] = 1;
while (tmp--) ans.num[n] *= 10;
return ans * (*this);
}
//绝对值
BigInteger abs() const {
BigInteger ans(*this);
ans.sign = true;
return ans;
}
//正号
const BigInteger &operator+() const { return *this; }
// + 运算符
BigInteger operator+(const BigInteger &b) const {
if (!b.sign) { return *this - (-b); }
if (!sign) { return b - (-*this); }
BigInteger ans;
ans.num.clear();
for (int i = 0, g = 0;; i++) {
if (g == 0 && i >= num.size() && i >= b.num.size()) break;
int x = g;
if (i < num.size()) x += num[i];
if (i < b.num.size()) x += b.num[i];
ans.num.push_back(x % BASE);
g = x / BASE;
}
ans.setLength();
return ans;
}
//负号
BigInteger operator-() const {
BigInteger ans(*this);
if (ans != 0) ans.sign = !ans.sign;
return ans;
}
// - 运算符
BigInteger operator-(const BigInteger &b) const {
if (!b.sign) { return *this + (-b); }
if (!sign) { return -((-*this) + b); }
if (*this < b) { return -(b - *this); }
BigInteger ans;
ans.num.clear();
for (int i = 0, g = 0;; i++) {
if (g == 0 && i >= num.size() && i >= b.num.size()) break;
int x = g;
g = 0;
if (i < num.size()) x += num[i];
if (i < b.num.size()) x -= b.num[i];
if (x < 0) {
x += BASE;
g = -1;
}
ans.num.push_back(x);
}
ans.setLength();
return ans;
}
// * 运算符
BigInteger operator*(const BigInteger &b) const {
int lena = num.size(), lenb = b.num.size();
std::vector<long long> ansLL;
for (int i = 0; i < lena + lenb; i++) ansLL.push_back(0);
for (int i = 0; i < lena; i++) {
for (int j = 0; j < lenb; j++) {
ansLL[i + j] += (long long) num[i] * (long long) b.num[j];
}
}
while (ansLL.back() == 0 && ansLL.size() != 1) ansLL.pop_back();
int len = ansLL.size();
long long g = 0, tmp;
BigInteger ans;
ans.sign = (ansLL.size() == 1 && ansLL[0] == 0) || (sign == b.sign);
ans.num.clear();
for (int i = 0; i < len; i++) {
tmp = ansLL[i];
ans.num.emplace_back((tmp + g) % BASE);
g = (tmp + g) / BASE;
}
if (g > 0) ans.num.emplace_back(g);
ans.setLength();
return ans;
}
// / 运算符 (大数除小数)
BigInteger operator/(const long long &b) const {
BigInteger c;
c.num.clear();
for (int i = 0; i < num.size(); i++) {
c.num.push_back(0);
}
long long g = 0;
for (int i = num.size() - 1; i >= 0; i--) {
c.num[i] = int((num[i] + g * BASE) / b);
g = num[i] + g * BASE - c.num[i] * b;
}
for (int i = num.size() - 1; c.num[i] == 0; i--) {
c.num.pop_back();
}
return c;
}
// /运算符 (大数除大数)
BigInteger operator/(const BigInteger &b) const {
BigInteger aa((*this).abs());
BigInteger bb(b.abs());
if (aa < bb) return 0;
char *str = new char[aa.size() + 1];
memset(str, 0, sizeof(char) * (aa.size() + 1));
BigInteger tmp;
int lena = aa.length, lenb = bb.length;
for (int i = 0; i <= lena - lenb; i++) {
tmp = bb.e(lena - lenb - i);
while (aa >= tmp) {
++str[i];
aa = aa - tmp;
}
str[i] += '0';
}
BigInteger ans(str);
delete[]str;
ans.sign = (ans == 0 || sign == b.sign);
return ans;
}
// % 运算符 (大数取模小数)
BigInteger operator%(const long long &b) const {
long long ans = 0;
for (int i = num.size() - 1; i >= 0; i--)
ans = (ans * BASE + num[i]) % b;
return ans;
}
// %运算符 (大数取模大数)
BigInteger operator%(const BigInteger &b) const {
return *this - *this / b * b;
}
BigInteger &operator++() {
*this = *this + 1;
return *this;
} // ++ 运算符
BigInteger &operator--() {
*this = *this - 1;
return *this;
} // -- 运算符
BigInteger &operator+=(const BigInteger &b) {
*this = *this + b;
return *this;
} // += 运算符
BigInteger &operator-=(const BigInteger &b) {
*this = *this - b;
return *this;
} // -= 运算符
BigInteger &operator*=(const BigInteger &b) {
*this = *this * b;
return *this;
} // *=运算符
BigInteger &operator/=(const long long &b) {
*this = *this / b;
return *this;
} // /=运算符
BigInteger &operator/=(const BigInteger &b) {
*this = *this / b;
return *this;
} // /= 运算符
BigInteger &operator%=(const long long &b) {
*this = *this % b;
return *this;
} // %=运算符
BigInteger &operator%=(const BigInteger &b) {
*this = *this % b;
return *this;
} // %=运算符
// < 运算符
bool operator<(const BigInteger &b) const {
if (sign && !b.sign) { return false; }//正负
else if (!sign && b.sign) { return true; }//负正
else if (!sign && !b.sign) { return -b < -*this; }//负负
//正正
if (num.size() != b.num.size()) return num.size() < b.num.size();
for (int i = num.size() - 1; i >= 0; i--)
if (num[i] != b.num[i]) return num[i] < b.num[i];
return false;
}
bool operator>(const BigInteger &b) const { return b < *this; } // > 运算符
bool operator<=(const BigInteger &b) const { return !(b < *this); } // <= 运算符
bool operator>=(const BigInteger &b) const { return !(*this < b); } // >= 运算符
bool operator!=(const BigInteger &b) const { return b < *this || *this < b; } // != 运算符
bool operator==(const BigInteger &b) const { return !(b < *this) && !(*this < b); }//==运算符
bool operator||(const BigInteger &b) const { return *this != 0 || b != 0; } // || 运算符
bool operator&&(const BigInteger &b) const { return *this != 0 && b != 0; } // && 运算符
bool operator!() { return (bool) (*this == 0); } // ! 运算符
//重载<<使得可以直接输出大数
friend std::ostream &operator<<(std::ostream &out, const BigInteger &x) {
if (!x.sign) out << '-';
out << x.num.back();
for (int i = x.num.size() - 2; i >= 0; i--) {
char buf[10];
//如WIDTH和BASR有变化,此处要修改为%0(WIDTH)d
sprintf(buf, "%08d", x.num[i]);
for (int j = 0; j < strlen(buf); j++) out << buf[j];
}
return out;
}
//重载>>使得可以直接输入大数
friend std::istream &operator>>(std::istream &in, BigInteger &x) {
std::string str;
in >> str;
size_t len = str.size();
int start = 0;
if (str[0] == '-') start = 1;
if (str[start] == '\0') return in;
for (int i = start; i < len; i++) {
if (str[i] < '0' || str[i] > '9') return in;
}
x.sign = !start;
x = str.c_str();
return in;
}
BigInteger pow(int n) {
BigInteger ans = 1, base = *this;
while (n) {
if (n & 1) ans = ans * base;
base = base * base;
n >>= 1;
}
return ans;
}
};
int main() {
BigInteger a, b;
std::cin >> a >> b;
std::cout << (a + b) << std::endl;
return 0;
}