Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <utility>
- #include <functional>
- #include <algorithm>
- #include <cassert>
- using namespace std;
- struct long_num
- {
- static constexpr int BASE = 10;
- vector<int> digits;
- explicit long_num(int x = 0) //privychka pisat' explicit
- : digits(1, x)
- {
- normalize();
- }
- long_num operator + (long_num const& other) const
- {
- long_num result;
- result.digits.assign(max(digits.size(), other.digits.size()), 0);
- for (size_t i = 0; i < digits.size(); ++i)
- result.digits[i] += digits[i];
- for (size_t i = 0; i < other.digits.size(); ++i)
- result.digits[i] += other.digits[i];
- result.normalize();
- return result;
- }
- long_num operator - (long_num const& other) const
- {
- long_num result;
- result.digits.assign(max(digits.size(), other.digits.size()), 0);
- for (size_t i = 0; i < digits.size(); ++i)
- result.digits[i] += digits[i];
- for (size_t i = 0; i < other.digits.size(); ++i)
- result.digits[i] -= other.digits[i];
- result.normalize();
- return result;
- }
- long_num operator * (long_num const& other) const
- {
- long_num result;
- result.digits.assign(digits.size() + other.digits.size(), 0);
- for (size_t i = 0; i < digits.size(); ++i)
- for (size_t j = 0; j < other.digits.size(); ++j)
- result.digits[i + j] += digits[i] * other.digits[j]; //TODO: check perepolneniya; budet rabota' do overdofiga dliny, tk BASE == 10
- result.normalize();
- return result;
- }
- void normalize()
- {
- for (size_t i = 0; i < digits.size(); ++i)
- if (!(0 <= digits[i] && digits[i] < BASE)) //kazhetsya, delit' dol'she chem ifat'
- {
- auto p = digits[i] / BASE, q = digits[i] % BASE; //digits[i] == p * BASE + q
- if (q < 0)
- p -= 1, q += BASE; //p * BASE + q == (p - 1) * BASE + (q + BASE)
- assert(p != 0); //perenos est' vsegda
- if (i + 1 == digits.size()) //mesto est'? a esli naidu?
- {
- if (p == -1 && q == BASE - 1)
- break;
- digits.push_back(0);
- }
- digits[i + 1] += p;
- digits[i] = q;
- }
- while (digits.size() > 1 && digits.back() == 0) //zapis' dlya 0 budet { 0 }
- digits.pop_back();
- }
- bool is_negative() const
- {
- return digits.back() < 0;
- }
- };
- auto read_long_num = [] (auto & stream) {
- string s;
- stream >> s;
- assert(!s.empty()); //shito eto bylo?
- bool negative = false;
- if (s[0] == '-')
- {
- negative = true;
- s.erase(s.begin());
- }
- long_num result;
- result.digits.assign(s.length(), 0);
- for (size_t i = 0; i < s.length(); ++i)
- result.digits[s.length() - i - 1] = s[i] - '0';
- static_assert(long_num::BASE == 10, "zdes' dolzhen byt' perevod");
- result.normalize();
- if (negative) //a chto eshe takoe unarnyj minus?
- result = long_num(0) - result;
- return result;
- };
- auto write_long_num = [] (auto & stream, long_num value) { //kopiruem special'no
- static_assert(long_num::BASE == 10, "zdes' dolzhen byt' perevod");
- if (value.is_negative())
- {
- stream << '-';
- value = long_num(0) - value;
- }
- for (size_t i = 0; i < value.digits.size(); ++i)
- stream << char('0' + value.digits[value.digits.size() - i - 1]);
- };
- int main()
- {
- ifstream cin("input.txt");
- ofstream cout("output.txt");
- long_num a = read_long_num(cin);
- long_num b = read_long_num(cin);
- write_long_num(cout, a - b);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement