Advertisement
tuki2501

bignum.cpp

Nov 8th, 2021
640
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef vector<ll> bigNum;
  6.  
  7. const ll BASE = 1e9;
  8.  
  9. bigNum stobn(string s) {
  10.   bigNum c;
  11.   reverse(s.begin(), s.end());
  12.   while ((int) s.size() % 9) s += '0';
  13.   reverse(s.begin(), s.end());
  14.   for (int i = (int) s.size() - 9; i >= 0; i -= 9) {
  15.     c.push_back(stoll(s.substr(i, 9)));
  16.   }
  17.   return c;
  18. }
  19.  
  20. bigNum normalize(bigNum a) {
  21.   while (a.size() > 1 && a.back() == 0) a.pop_back();
  22.   return a;
  23. }
  24.  
  25. bigNum operator+(bigNum a, bigNum b) {
  26.   while (a.size() < b.size()) a.push_back(0);
  27.   while (b.size() < a.size()) b.push_back(0);
  28.   bigNum c; c.resize(a.size());
  29.   ll d = 0;
  30.   for (int i = 0; i < (int) a.size(); i++) {
  31.     c[i] = (a[i] + b[i] + d) % BASE;
  32.     d = (a[i] + b[i] + d) / BASE;
  33.   }
  34.   if (d) c.push_back(d);
  35.   return normalize(c);
  36. }
  37.  
  38. bigNum operator-(bigNum a, bigNum b) {
  39.   while (b.size() < a.size()) b.push_back(0);
  40.   bigNum c; c.resize(a.size());
  41.   ll d = 0;
  42.   for (int i = 0; i < (int) a.size(); i++) {
  43.     c[i] = a[i] - (b[i] + d);
  44.     if (c[i] < 0) c[i] += BASE, d = 1; else d = 0;
  45.   }
  46.   return normalize(c);
  47. }
  48.  
  49. bigNum operator*(bigNum a, ll b) {
  50.   bigNum c; c.resize(a.size());
  51.   ll d = 0;
  52.   for (int i = 0; i < (int) a.size(); i++) {
  53.     c[i] = (a[i] * b + d) % BASE;
  54.     d = (a[i] * b + d) / BASE;
  55.   }
  56.   if (d) c.push_back(d);
  57.   return normalize(c);
  58. }
  59.  
  60. bigNum shift(bigNum a, int b) {
  61.   reverse(a.begin(), a.end());
  62.   for (int i = 0; i < b; i++) {
  63.     a.push_back(0);
  64.   }
  65.   reverse(a.begin(), a.end());
  66.   return a;
  67. }
  68.  
  69. bigNum operator*(bigNum a, bigNum b) {
  70.   bigNum c; c.resize(1, 0);
  71.   for (int i = 0; i < (int) b.size(); i++) {
  72.     c = c + shift(a * b[i], i);
  73.   }
  74.   return normalize(c);
  75. }
  76.  
  77. bool operator>=(bigNum a, bigNum b) {
  78.   if (a.size() > b.size()) return true;
  79.   if (a.size() < b.size()) return false;
  80.   for (int i = (int) a.size() - 1; i >= 0; i--) {
  81.     if (a[i] > b[i]) return true;
  82.     if (a[i] < b[i]) return false;
  83.   }
  84.   return true;
  85. }
  86.  
  87. ostream& operator<<(ostream &os, bigNum a) {
  88.   int n = a.size();
  89.   for (int i = n - 1; i >= 0; i--) {
  90.     if (i == n - 1) os << a[i];
  91.     else os << setw(9) << setfill('0') << a[i];
  92.   }
  93.   return os;
  94. }
  95.  
  96. istream& operator>>(istream &is, bigNum &a) {
  97.   string s; is >> s;
  98.   a = stobn(s);
  99.   return is;
  100. }
  101.  
  102. signed main() {
  103.   bigNum a, b;
  104.   cin >> a >> b;
  105.   cout << a + b << '\n';
  106.   if (a >= b) cout << a - b << '\n';
  107.   else cout << '-' << b - a << '\n';
  108.   cout << a * b << '\n';
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement