- meinachuan 的博客
高精度
- 2025-1-5 11:20:16 @
高精度加法以及减法:
使用vector
来写:
#include <bits/stdc++.h>
using namespace std;
int flag = 1;
string to_string(__int128 x) {
string ans = "";
if (x < 0) {
x = -x;
putchar('-');
}
if (x == 0) {
return "0";
}
for (; x; x /= 10) {
ans = (char)(x % 10 + '0') + ans;
}
return ans;
}
istream& operator >> (istream &cin, __int128 &x) {
string str;
cin >> str;
x = 0;
for (auto v : str) {
x = (x * 10) + (v - '0');
}
return cin;
}
ostream& operator << (ostream& cout, const __int128 &x) {
cout << to_string(x);
return cout;
}
istream& operator >> (istream &cin, vector<int> &v) {
string str;
cin >> str;
v.resize(str.size());
for (int i = str.size() - 1, j = 0; i >= 0; i--, j++) {
v[j] = (str[i] - '0');
}
return cin;
}
string to_string(const vector<int> &x) {
string ans = "";
for (int i = x.size() - 1; i >= 0; i--) {
ans += char(x[i] + '0');
}
return ans;
}
ostream& operator << (ostream& cout, const vector<int> &v) {
cout << to_string(v);
return cout;
}
vector<int> operator + (const vector<int> &a, const vector<int> &b) {
vector<int> ans(max(a.size(), b.size()) + 1);
for (int i = 0; i < ans.size() - 1; i++) {
ans[i] = (i < a.size() ? a[i] : 0) + (i < b.size() ? b[i] : 0);
}
for (int i = 0; i < ans.size() - 1; i++) {
ans[i + 1] += ans[i] / 10;
ans[i] %= 10;
}
while (ans.size() != 0 && ans.back() == 0) {
ans.pop_back();
}
return ans;
}
vector<int> operator - (const vector<int> &a, const vector<int> &b) {
vector<int> ans(a.size());
for (int i = 0; i < a.size(); i++) {
ans[i] = a[i] - (i < b.size() ? b[i] : 0);
}
for (int i = 0; i < ans.size(); i++) {
while (ans[i] < 0) {
ans[i + 1]--;
ans[i] += 10;
}
}
while (ans.size() != 0 && ans.back() == 0) ans.pop_back();
return ans;
}
vector<int> operator += (vector<int> &a, const vector<int> &b) {
a.resize(max(a.size(), b.size()) + 1);
for (int i = 0; i < a.size() - 1; i++) {
a[i] += i < b.size() ? b[i] : 0;
}
for (int i = 0; i < a.size() - 1; i++) {
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
while (a.size() && a.back() == 0) {
a.pop_back();
}
return a;
}
bool operator == (const vector<int> &a, const vector<int> &b) {
int flag1 = 0, flag2 = 0;
if (a.size() == b.size()) {
flag1 = 1;
}
if (!flag1) {
return false;
}
for (int i = 0; i < a.size(); i++) {
if (a[i] == b[i]) {
continue;
}
else {
return false;
}
}
return true;
}
bool operator < (const vector<int> &a, const vector<int> &b) {
if (a.size() == b.size()) {
for (int i = a.size() - 1; i >= 0; i--) {
if (a[i] == b[i]) {
continue;
}
return a[i] < b[i];
}
}
return a.size() < b.size();
}
int main()
{
int n;
cin >> n;
vector<int> g[1001];
for (int i = 1; i <= n; i++) {
cin >> g[i];
}
vector<int> ans1, ans2, ans;
for (int i = 1; i <= n; i++) {
if (i % 2 == 1) ans1 = ans1 + g[i];
if (i % 2 == 0) ans2 = ans2 + g[i];
}
if (ans1 == ans2) {
cout << 0 << '\n';
}
if (ans1 < ans2) {
putchar('-');
swap(ans1, ans2);
}
ans = ans1 - ans2;
cout << ans << '\n';
return 0;
}