Advertisement
nicuvlad76

Untitled

Nov 17th, 2023
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.19 KB | None | 0 0
  1. class big_int
  2. {
  3. private:
  4.   int sign; // -1 daca numarul este negativ, +1 daca este pozitiv
  5.   string digits; // cifrele numarului, stocate in ordine inversa
  6.  
  7. public:
  8.   big_int()
  9.   {
  10.     digits = "0";
  11.     sign = 1;
  12.   }
  13.  
  14.   big_int(string s)
  15.   {
  16.     int i;
  17.     if (s.front() == '-')
  18.       sign = -1,  i = 1;
  19.     else if (s.front() == '+')
  20.       sign = 1,  i = 1;
  21.     else
  22.       sign = 1,  i = 0;
  23.  
  24.     for (int j = s.size() - 1; j >= i; --j)
  25.       digits.push_back(s[j]);
  26.   }
  27.  
  28.   big_int(char c)
  29.   {
  30.     sign = 1;
  31.     digits.push_back(c);
  32.   }
  33.  
  34.   big_int(int n)
  35.   {
  36.     if (n < 0)
  37.       sign = -1;
  38.     else
  39.       sign = 1;
  40.  
  41.     n = std::abs(n);
  42.     do {
  43.       digits.push_back(n%10 + '0');
  44.       n /= 10;
  45.     } while (n);
  46.   }
  47.  
  48.   operator string() const
  49.   {
  50.     string ans;
  51.  
  52.     if (sign == -1)
  53.     {
  54.       ans.resize(1 + digits.size());
  55.       ans.front() = '-';
  56.       reverse_copy(digits.begin(), digits.end(), ans.begin() + 1);
  57.       return ans;
  58.     }
  59.     else
  60.     {
  61.       ans.resize(digits.size());
  62.       reverse_copy(digits.begin(), digits.end(), ans.begin());
  63.       return ans;
  64.     }
  65.   }
  66.  
  67.   friend bool operator == (const big_int& a, const big_int& b)
  68.   {
  69.     return (a.sign == b.sign && a.digits == b.digits);
  70.   }
  71.  
  72.   friend bool operator < (const big_int& a, const big_int& b)
  73.   {
  74.     if (a.sign == -1 && b.sign == 1)
  75.       return true;
  76.  
  77.     if (a.sign == 1 && b.sign == -1)
  78.       return false;
  79.  
  80.     if (a.sign == -1 && b.sign == -1)
  81.       return (b.abs() < a.abs());
  82.  
  83.     if (a.sign == 1 && b.sign == 1)
  84.     {
  85.       if (a.digits.size() < b.digits.size())
  86.         return true;
  87.  
  88.       if (a.digits.size() > b.digits.size())
  89.         return false;
  90.  
  91.       for (int i = a.digits.size() - 1; i >= 0; --i)
  92.         if (a.digits[i] < b.digits[i])
  93.           return true;
  94.         else if (a.digits[i] > b.digits[i])
  95.           return false;
  96.  
  97.       return false;
  98.     }
  99.   }
  100.  
  101.   friend bool operator <= (const big_int& a, const big_int& b)
  102.   {
  103.     return (a < b || a == b);
  104.   }
  105.  
  106.   friend bool operator >= (const big_int& a, const big_int& b)
  107.   {
  108.     return !(a < b);
  109.   }
  110.  
  111.   big_int abs() const
  112.   {
  113.     big_int ans = *this;
  114.     ans.sign = 1;
  115.  
  116.     return ans;
  117.   }
  118.    
  119.   big_int operator - () const
  120.   {
  121.     if (digits == "0")
  122.       return *this;
  123.  
  124.     big_int ans = *this;
  125.     ans.sign *= -1;
  126.     return ans;
  127.   }
  128.  
  129.   big_int operator + (const big_int& b) const
  130.   {
  131.     if (sign == -1 && b.sign == -1) return -(this->abs() + b.abs());
  132.  
  133.     if (sign == -1 && b.sign == 1)  return b - this->abs();
  134.  
  135.     if (sign == 1 && b.sign == -1)   return *this - b.abs();
  136.  
  137.     if (sign == 1 && b.sign == 1)
  138.     {
  139.       big_int ans;
  140.       ans.sign = 1;
  141.       ans.digits = "";
  142.  
  143.       int cnt = 0, i;
  144.       for (i = 0; i < std::min(digits.size(), b.digits.size()); ++i)
  145.       {
  146.         int sum = digits[i]-'0' + b.digits[i]-'0' + cnt;
  147.         ans.digits.push_back(sum%10 + '0');
  148.         cnt = sum/10;
  149.       }
  150.  
  151.       for (; i < digits.size(); ++i)
  152.       {
  153.         int sum = digits[i]-'0' + cnt;
  154.         ans.digits.push_back(sum%10 + '0');
  155.         cnt = sum/10;
  156.       }
  157.  
  158.       for (; i < b.digits.size(); ++i)
  159.       {
  160.         int sum = b.digits[i]-'0' + cnt;
  161.         ans.digits.push_back(sum%10 + '0');
  162.         cnt = sum/10;
  163.       }
  164.  
  165.       for (; cnt; cnt /= 10)
  166.         ans.digits.push_back(cnt%10 + '0');
  167.  
  168.       return ans;
  169.     }
  170.   }
  171.  
  172.   big_int operator - (const big_int& b) const
  173.   {
  174.     if (sign == -1 && b.sign == -1) return b.abs() - this->abs();
  175.  
  176.     if (sign == -1 && b.sign == 1) return -(this->abs() + b);
  177.  
  178.     if (sign == 1 && b.sign == -1) return *this + b.abs();
  179.  
  180.     if (sign == 1 && b.sign == 1)
  181.     {
  182.       if (*this < b) return -(b - *this);
  183.       big_int ans;
  184.       ans.sign = 1;
  185.       ans.digits = "";
  186.       int i;
  187.       bool cnt = 0;
  188.  
  189.       for (i = 0; i < std::min(digits.size(), b.digits.size()); ++i)
  190.       {
  191.         if ((digits[i]-'0') - (b.digits[i]-'0') - cnt < 0)
  192.         {
  193.           ans.digits.push_back((digits[i]-'0') - (b.digits[i]-'0') - cnt + 10 + '0');
  194.           cnt = 1;
  195.         }
  196.         else
  197.         {
  198.           ans.digits.push_back((digits[i]-'0') - (b.digits[i]-'0') - cnt + '0');
  199.           cnt = 0;
  200.         }
  201.       }
  202.  
  203.       for (; i < digits.size(); ++i)
  204.       {
  205.         if ((digits[i]-'0') - cnt < 0)
  206.         {
  207.           ans.digits.push_back((digits[i]-'0') - cnt + 10 + '0');
  208.           cnt = 1;
  209.         }
  210.         else
  211.         {
  212.           ans.digits.push_back((digits[i]-'0') - cnt + '0');
  213.           cnt = 0;
  214.         }
  215.       }
  216.  
  217.       while (ans.digits.size() != 1 && ans.digits.back() == '0')
  218.         ans.digits.pop_back();
  219.       return ans;
  220.     }
  221.   }
  222.  
  223.   big_int operator * (const big_int& b) const
  224.   {
  225.     if (*this == big_int(0) || b == big_int(0)) return big_int(0);
  226.     big_int ans;
  227.     if (sign + b.sign == 0)  ans.sign = -1;
  228.     else ans.sign = 1;
  229.     ans.digits.resize(digits.size() + b.digits.size(), '0');
  230.  
  231.     int cnt, i, j;
  232.     for (i = 0; i < digits.size(); ++i)
  233.     {
  234.       cnt = 0;
  235.       for (j = 0; j < b.digits.size(); ++j)
  236.       {
  237.         int sum = (ans.digits[i+j]-'0' + (digits[i]-'0') * (b.digits[j]-'0') + cnt);
  238.         ans.digits[i+j] = sum%10 + '0';
  239.         cnt = sum/10;
  240.       }
  241.  
  242.       if (cnt)
  243.         ans.digits[i+j] = (ans.digits[i+j]-'0' + cnt) + '0';
  244.     }
  245.  
  246.     while (ans.digits.size() != 1 && ans.digits.back() == '0')
  247.       ans.digits.pop_back();
  248.  
  249.     if (ans.digits == "0")
  250.       return big_int(0);
  251.     return ans;
  252.   }
  253.  
  254.   big_int operator / (const big_int& b) const
  255.   {
  256.     if (*this == big_int(0)) return big_int(0);
  257.     big_int ans, A = this->abs(), B = b.abs();
  258.  
  259.     if (A < B)  return big_int(0);
  260.     big_int dei, inm;
  261.     dei.digits = "";
  262.     ans.digits = "";
  263.     int i;
  264.     for (i = digits.size() - 1; ; --i)
  265.     {
  266.       dei.digits.insert(dei.digits.begin(), digits[i]);
  267.       if (dei >= B)
  268.         break;
  269.     }
  270.  
  271.     for (i--; i >= -1; --i)
  272.     {
  273.       for (int j = 0; j <= 9; ++j)
  274.       {
  275.         inm.digits[0] = j+'0';
  276.         if ( !(B * inm <= dei) )
  277.         {
  278.           inm.digits[0]--;
  279.           break;
  280.         }
  281.       }
  282.  
  283.       ans.digits.push_back(inm.digits[0]);
  284.       dei = dei - B*inm;
  285.       if (dei.digits == "0")
  286.         dei.digits = "";
  287.  
  288.       if (i >= 0) dei.digits.insert(dei.digits.begin(), digits[i]);
  289.     }
  290.  
  291.     if (sign + b.sign == 0)
  292.       ans.sign = -1;
  293.     else
  294.       ans.sign = 1;
  295.     reverse(ans.digits.begin(), ans.digits.end());
  296.     return ans;
  297.   }
  298.  
  299.   big_int operator % (const big_int& b) const
  300.   {
  301.     return *this - *this / b * b;
  302.   }
  303.  
  304.   friend istream& operator >> (istream& in, big_int& n)
  305.   {
  306.     int i;
  307.     string nr;
  308.     in >> nr;
  309.     if (nr.front() == '-') n.sign = -1,   i = 1;
  310.     else if (nr.front() == '+') n.sign = 1,   i = 1;
  311.     else n.sign = 1,   i = 0;
  312.     if (nr == "-0")  n.sign = +1;
  313.     n.digits.resize(nr.size() - i);
  314.     reverse_copy(nr.begin() + i, nr.end(), n.digits.begin());
  315.  
  316.     return in;
  317.   }
  318.  
  319.   friend ostream& operator << (ostream& out, const big_int& n)
  320.   {
  321.     if (n.sign == -1)  out << '-';
  322.     for (int i = n.digits.size() - 1; i >= 0; --i)
  323.       out << n.digits[i];
  324.     return out;
  325.   }
  326. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement