A+B problem最简单不会报错题解
2025-06-28 20:09:46
发布于:新疆
10阅读
0回复
0点赞
废话不多说,直接上代码,代码不难,就是A+B,但是避免意外用个高精度,在避免出错的同时装个B,浅浅的检查亿遍
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
#include <algorithm>
#include <cctype>
using namespace std;
class BN {
private:
vector<int> d;
bool neg;
void tlz() {
while (d.size() > 1 && d.back() == 0) d.pop_back();
if (d.size() == 1 && d[0] == 0) neg = false;
}
public:
BN(const string& s) {
if (s.empty()) throw invalid_argument("");
neg = (s[0] == '-');
d.clear();
for (int i = s.size() - 1; i >= (neg ? 1 : 0); --i) {
if (!isdigit(s[i])) throw invalid_argument("");
d.push_back(s[i] - '0');
}
tlz();
}
BN operator+(const BN& o) const {
if (!neg && !o.neg) return add(o);
else if (neg && o.neg) { BN r = add(o); r.neg = true; return r; }
else if (neg && !o.neg) { BN a = *this; a.neg = false; return o.sub(a); }
else { BN a = o; a.neg = false; return sub(a); }
}
BN add(const BN& o) const {
BN r = *this;
int c = 0;
for (size_t i = 0; i < max(r.d.size(), o.d.size()) || c; ++i) {
if (i == r.d.size()) r.d.push_back(0);
r.d[i] += c + (i < o.d.size() ? o.d[i] : 0);
c = r.d[i] / 10;
r.d[i] %= 10;
}
return r;
}
BN sub(const BN& o) const {
if (cmp(o) < 0) { BN r = o.sub(*this); r.neg = true; return r; }
BN r = *this;
int b = 0;
for (size_t i = 0; i < o.d.size() || b; ++i) {
r.d[i] -= b + (i < o.d.size() ? o.d[i] : 0);
b = r.d[i] < 0;
if (b) r.d[i] += 10;
}
r.tlz();
return r;
}
int cmp(const BN& o) const {
if (d.size() != o.d.size()) return d.size() - o.d.size();
for (int i = d.size() - 1; i >= 0; --i) {
if (d[i] != o.d[i]) return d[i] - o.d[i];
}
return 0;
}
string ts() const {
if (d.empty()) return "0";
string r;
if (neg) r += '-';
for (int i = d.size() - 1; i >= 0; --i) r += d[i] + '0';
return r;
}
};
pair<string, string> vi(const string& s) {
size_t p = s.find(' ');
if (p == string::npos) throw invalid_argument("");
string a = s.substr(0, p);
string b = s.substr(p + 1);
auto ivn = [](const string& s) {
if (s.empty()) return false;
size_t st = (s[0] == '-' || s[0] == '+') ? 1 : 0;
if (st >= s.size()) return false;
for (size_t i = st; i < s.size(); ++i) {
if (!isdigit(s[i])) return false;
}
return true;
};
if (!ivn(a) || !ivn(b)) throw invalid_argument("");
return {a, b};
}
int main() {
try {
string l;
if (!getline(cin, l)) throw runtime_error("");
auto [a, b] = vi(l);
BN x(a);
BN y(b);
BN s = x + y;
cout << s.ts() << endl;
} catch (const exception& e) {
cerr << "Error" << endl;
return 1;
}
return 0;
}
全部评论 1
《说明/提示 0≤a,b≤10^9》
1周前 来自 浙江
0
有帮助,赞一个