Advertisement
deushiro

cpp

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