Lexolordan

Untitled

Dec 17th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.60 KB | None | 0 0
  1. #include <vector>
  2. #include <string>
  3.  
  4. class BigInteger {
  5. public:
  6.     BigInteger();
  7.     BigInteger(int number);
  8.     BigInteger(std::string s);
  9.    
  10.     ~BigInteger();
  11.    
  12.     bool operator==(const BigInteger &second) const;
  13.     bool operator<=(const BigInteger &second) const;
  14.     bool operator!=(const BigInteger &second) const;
  15.     bool operator>=(const BigInteger &second) const;
  16.     bool operator>(const BigInteger &second) const;
  17.     bool operator<(const BigInteger &second) const;
  18.    
  19.     BigInteger operator+(const BigInteger &second) const;
  20.     BigInteger operator-(const BigInteger &second) const;
  21.     BigInteger operator*(const BigInteger &second) const;
  22.     BigInteger operator%(const BigInteger &second) const;
  23.     BigInteger operator/(const BigInteger &second) const;
  24.  
  25.     BigInteger &operator+=(const BigInteger &second);
  26.     BigInteger &operator-=(const BigInteger &second);
  27.     BigInteger &operator*=(const BigInteger &second);
  28.     BigInteger &operator%=(const BigInteger &second);
  29.     BigInteger &operator/=(const BigInteger &second);
  30.    
  31.     const BigInteger operator-() const;
  32.    
  33.     BigInteger &operator++();
  34.     BigInteger operator++(int);
  35.     BigInteger &operator--();
  36.     BigInteger operator--(int);
  37.  
  38.     explicit operator bool() const;
  39.     std::string toString() const;
  40.    
  41. private:
  42.     std::vector<char> numbers_;
  43.     int sign_;
  44.    
  45.     int length() const {
  46.         return (int)numbers_.size();
  47.     }
  48. };
  49.  
  50. BigInteger::BigInteger() : sign_(0) {}
  51.  
  52. BigInteger::BigInteger(int number) {
  53.     sign_ = 0;
  54.    
  55.     if (number > 0) {
  56.         sign_ = 1;
  57.     } else if (number < 0) {
  58.         sign_ = -1;
  59.         number *= -1;
  60.     }
  61.    
  62.     while (number) {
  63.         numbers_.push_back((char)(number % 10));
  64.         number /= 10;
  65.     }
  66. }
  67.  
  68. BigInteger::BigInteger(std::string s) {
  69.     sign_ = 1;
  70.    
  71.     if (s.length() == 0 || (s.length() == 1 && s[0] == '0')) {
  72.         sign_ = 0;
  73.         return;
  74.     }
  75.    
  76.     int last = 0;
  77.     if (s.length() != 0 && s[0] == '-') {
  78.         sign_ = -1;
  79.         last = 1;
  80.     }
  81.    
  82.     if (s.length() != 0 && s[0] == '+') {
  83.         last = 1;
  84.     }
  85.    
  86.     for (int i = (int)s.length() - 1; i >= last; i--) {
  87.         numbers_.push_back(s[i] - '0');
  88.     }
  89. }
  90.  
  91. BigInteger::~BigInteger() {
  92.     numbers_.clear();
  93. }
  94.  
  95. bool BigInteger::operator==(const BigInteger &second) const {
  96.     if (sign_ != second.sign_ || length() != second.length()) {
  97.         return false;
  98.     }
  99.    
  100.     for (int i = 0; i < length(); ++i) {
  101.         if (numbers_[i] != second.numbers_[i]) {
  102.             return false;
  103.         }
  104.     }
  105.    
  106.     return true;
  107. }
  108.  
  109. bool BigInteger::operator<=(const BigInteger &second) const {
  110.     return *this < second || second == *this;
  111. }
  112.  
  113. bool BigInteger::operator!=(const BigInteger &second) const {
  114.     return !((*this) == second);
  115. }
  116.  
  117. bool BigInteger::operator>=(const BigInteger &second) const {
  118.     return second < *this || second == *this;
  119. }
  120.  
  121. bool BigInteger::operator>(const BigInteger &second) const {
  122.     return second < *this;
  123. }
  124.  
  125. bool BigInteger::operator<(const BigInteger &second) const {
  126.     if (sign_ != second.sign_) {
  127.         return sign_ < second.sign_;
  128.     }
  129.    
  130.     if (length() == second.length()) {
  131.         for (int i = length() - 1; i >= 0; --i) {
  132.             if (numbers_[i] != second.numbers_[i]) {
  133.                 return numbers_[i] < second.numbers_[i];
  134.             }
  135.         }
  136.        
  137.         return false;
  138.     }
  139.    
  140.     return length() < second.length();
  141. }
  142.  
  143. BigInteger BigInteger::operator+(const BigInteger &second) const {
  144.     if (!sign_)
  145.         return second;
  146.    
  147.     if (!second.sign_) {
  148.         return *this;
  149.     }
  150.    
  151.     if (second.sign_ == -1 && sign_ == 1) {
  152.         return (*this) - (-second);
  153.     }
  154.    
  155.     if (second.sign_ == 1 && sign_ == -1) {
  156.         return (second) - (-*this);
  157.     }
  158.    
  159.     if (second.sign_ == -1 && sign_ == -1) {
  160.         return -((-second) + (-*this));
  161.     }
  162.    
  163.     BigInteger result;
  164.     int add = 0;
  165.     for (int i = 0; i < std::max(second.length(), length()); i++) {
  166.         int now = add + (i < second.length() ? second.numbers_[i] : 0) + (i < length() ? numbers_[i] : 0);
  167.         add = now / 10;
  168.         now %= 10;
  169.        
  170.         result.numbers_.push_back(now);
  171.     }
  172.     if (add != 0) {
  173.         result.numbers_.push_back(add);
  174.     }
  175.     result.sign_ = 1;
  176.    
  177.     return result;
  178. }
  179.  
  180. BigInteger BigInteger::operator-(const BigInteger &second) const {
  181.     if (*this == second)
  182.         return BigInteger();
  183.    
  184.     if (!sign_)
  185.         return -second;
  186.    
  187.     if (!second.sign_) {
  188.         return *this;
  189.     }
  190.    
  191.     if (second.sign_ == -1 && sign_ == 1) {
  192.         return (*this) + (-second);
  193.     }
  194.    
  195.     if (second.sign_ == 1 && sign_ == -1) {
  196.         return -((-*this) + second);
  197.     }
  198.    
  199.     if (second.sign_ == -1 && sign_ == -1) {
  200.         return (-second) - (-*this);
  201.     }
  202.    
  203.     if (*this < second) {
  204.         return -(second - *this);
  205.     }
  206.    
  207.     BigInteger result;
  208.     int add = 0;
  209.     for (int i = 0; i < length(); i++) {
  210.         int now = numbers_[i] - (i < second.length() ? second.numbers_[i] : 0) - add;
  211.        
  212.         if (now < 0) {
  213.             now += 10;
  214.             add = 1;
  215.         } else {
  216.             add = 0;
  217.         }
  218.        
  219.         result.numbers_.push_back(now);
  220.     }
  221.     while (!result.numbers_.empty() && !result.numbers_.back()) {
  222.         result.numbers_.pop_back();
  223.     }
  224.    
  225.     result.sign_ = 1;
  226.    
  227.     return result;
  228. }
  229.  
  230. BigInteger &BigInteger::operator+=(const BigInteger &second) {
  231.     return (*this) = *this + second;
  232. }
  233.  
  234. BigInteger &BigInteger::operator-=(const BigInteger &second) {
  235.     return (*this) = *this - second;
  236. }
  237.  
  238. const BigInteger BigInteger::operator-() const {
  239.     BigInteger res = *this;
  240.     res.sign_ *= -1;
  241.    
  242.     return res;
  243. }
  244.  
  245. BigInteger BigInteger::operator*(const BigInteger &second) const {
  246.     if (!second.length() || !length()) {
  247.         return BigInteger();
  248.     }
  249.     int new_sign_ = second.sign_ * sign_;
  250.    
  251.     BigInteger res = BigInteger();
  252.     res.sign_ = 1;
  253.    
  254.     for (int i = 0; i < length(); ++i) {
  255.         BigInteger add = BigInteger();
  256.         add.sign_ = 1;
  257.        
  258.         if (!numbers_[i]) {
  259.             continue;
  260.         }
  261.        
  262.         for (int j = 0; j < i; ++j) {
  263.             add.numbers_.push_back(0);
  264.         }
  265.         int nexts = 0;
  266.         for (int j = 0; j < second.length(); ++j) {
  267.             int now = numbers_[i] * second.numbers_[j] + nexts;
  268.            
  269.             nexts = now / 10;
  270.             now %= 10;
  271.            
  272.             add.numbers_.push_back(now);
  273.         }
  274.         if (nexts != 0) {
  275.             add.numbers_.push_back(nexts);
  276.         }
  277.         res = res + add;
  278.     }
  279.     res.sign_ = new_sign_;
  280.    
  281.     return res;
  282. }
  283.  
  284. BigInteger BigInteger::operator/(const BigInteger &second) const {
  285.     int sign = this->sign_ * second.sign_;
  286.    
  287.     BigInteger now = *this, s = second, result = 0, part = 0;
  288.     now.sign_ = 1;
  289.     s.sign_ = 1;
  290.    
  291.     if (now < s) {
  292.         return 0;
  293.     }
  294.    
  295.     while (part < s) {
  296.         part *= 10;
  297.         part += now.numbers_.back();
  298.         now.numbers_.pop_back();
  299.     }
  300.     int number = 9;
  301.     for (;s * number > part; number--) {}
  302.    
  303.     part -= s * number;
  304.     result *= 10;
  305.     result += number;
  306.    
  307.     while (now.numbers_.size() != 0) {
  308.         part *= 10;
  309.         part += now.numbers_.back();
  310.         now.numbers_.pop_back();
  311.        
  312.         int number = 9;
  313.         for (;s * number > part; number--) {}
  314.        
  315.         part -= s * number;
  316.         result *= 10;
  317.         result += number;
  318.     }
  319.     result.sign_ = sign;
  320.    
  321.     return result;
  322. }
  323.  
  324. BigInteger &BigInteger::operator*=(const BigInteger &second) {
  325.     return (*this) = *this * second;
  326. }
  327.  
  328. BigInteger &BigInteger::operator/=(const BigInteger &second) {
  329.     return (*this) = *this / second;
  330. }
  331.  
  332. BigInteger &BigInteger::operator%=(const BigInteger &second) {
  333.     return (*this) = *this % second;
  334. }
  335.  
  336. BigInteger BigInteger::operator%(const BigInteger &second) const {
  337.     return (*this) - (second * (*this / second));
  338. }
  339.  
  340. BigInteger &BigInteger::operator--() {
  341.     return operator-=(1);
  342. }
  343.  
  344. BigInteger BigInteger::operator--(int) {
  345.     BigInteger result(*this);
  346.     operator-=(1);
  347.    
  348.     return result;
  349. }
  350.  
  351. BigInteger &BigInteger::operator++() {
  352.     return operator+=(1);
  353. }
  354.  
  355. BigInteger BigInteger::operator++(int) {
  356.     BigInteger result(*this);
  357.     operator+=(1);
  358.    
  359.     return result;
  360. }
  361.  
  362.  BigInteger::operator bool() const {
  363.     return sign_ != 0;
  364. }
  365.  
  366. std::string BigInteger::toString() const {
  367.     std::string result = "";
  368.    
  369.     if (sign_ == 0) {
  370.         result += '0';
  371.     } else if (sign_ == -1) {
  372.         result += '-';
  373.     }
  374.    
  375.     for (int i = length() - 1; i >= 0; i--) {
  376.         result += (char)(numbers_[i] + '0');
  377.     }
  378.     return result;
  379. }
  380.  
  381. std::istream &operator>>(std::istream &i, BigInteger &object) {
  382.     std::string s;
  383.     i >> s;
  384.    
  385.     object = BigInteger(s);
  386.    
  387.     return i;
  388. }
  389.  
  390. std::ostream &operator<<(std::ostream &i, const BigInteger &object) {
  391.     i << object.toString();
  392.    
  393.     return i;
  394. }
  395.  
  396. BigInteger operator+(int n, BigInteger &second) {
  397.     return BigInteger(n) + second;
  398. }
  399.  
  400. BigInteger operator-(int n, BigInteger &second) {
  401.     return BigInteger(n) - second;
  402. }
  403.  
  404. BigInteger operator*(int n, BigInteger &second) {
  405.     return BigInteger(n) * second;
  406. }
  407.  
  408. BigInteger operator%(int n, BigInteger &second) {
  409.     return BigInteger(n) % second;
  410. }
  411.  
  412. BigInteger operator/(int n, BigInteger &second) {
  413.     return BigInteger(n) / second;
  414. }
Add Comment
Please, Sign In to add comment