Advertisement
den4ik2003

Untitled

Jan 8th, 2022
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <stdexcept>
  8.  
  9. class BigInteger;
  10.  
  11. bool operator==(const BigInteger& a, const BigInteger& b);
  12.  
  13. bool operator<(const BigInteger& a, const BigInteger& b);
  14.  
  15. bool operator!=(const BigInteger& a, const BigInteger& b);
  16.  
  17. bool operator>(const BigInteger& a, const BigInteger& b);
  18.  
  19. bool operator<=(const BigInteger& a, const BigInteger& b);
  20.  
  21. bool operator>=(const BigInteger& a, const BigInteger& b);
  22.  
  23. BigInteger operator+(const BigInteger& a, const BigInteger& b);
  24.  
  25. BigInteger operator-(const BigInteger& a, const BigInteger& b);
  26.  
  27. BigInteger operator*(const BigInteger& a, const BigInteger& b);
  28.  
  29. BigInteger operator/(const BigInteger& a, const BigInteger& b);
  30.  
  31. BigInteger operator%(const BigInteger& a, const BigInteger& b);
  32.  
  33. class BigInteger {
  34. private:
  35.     static const int calc_system = 1e9; //система счисления
  36.     const int calc = 9; /// потому что в каждом digit число имеет не более 8 разрядов
  37.     std::vector<long long> digits; //массив цифр в разрядах в обратном порядке
  38.     bool is_positive; //положительное ли число? 0 считаем положительным
  39.     static int stringIntCast(const std::string& s) { //строку в int
  40.         int res = 0, ten = 1;
  41.         for (int i = s.size() - 1; i >= 0; --i) {
  42.             res += (s[i] - '0') * ten;
  43.             ten *= 10;
  44.         }
  45.         return res;
  46.     }
  47.     static int how_many_digits(const int number) {
  48.         int power_of_ten = 1, scr_of_digits = 0;
  49.         while (number / power_of_ten != 0) {
  50.             power_of_ten *= 10;
  51.             ++scr_of_digits;
  52.         }
  53.         return  scr_of_digits;
  54.     }
  55.     void delete_nulls() {
  56.         if (digits.size() == 0) {
  57.             return;
  58.         }
  59.         size_t i = digits.size() - 1;
  60.         while (digits[i] == 0) {
  61.             i--;
  62.             digits.pop_back();
  63.             if (i + 1 == 0) {
  64.                 break;
  65.             }
  66.         }
  67.     }
  68. public:
  69.     BigInteger() = default;
  70.     BigInteger(const std::string& s) { ///случай пустой строки
  71.         int check = 0;
  72.         if (s[0] == '-') {
  73.             is_positive = false;
  74.             check = 1;
  75.         }
  76.         else {
  77.             is_positive = true;
  78.         }
  79.         int size = s.size();
  80.         int i = std::max(check, size - calc); ///точка, откуда мы начинаем считывание
  81.         do {
  82.             std::string temp_s = s.substr(i, std::min(calc, size - check));
  83.             int temp = stringIntCast(temp_s);
  84.             digits.push_back(temp);
  85.             i -= calc;
  86.             if (i + calc > check && i < check) {
  87.                 std::string temp2_s = s.substr(check, i + calc - check);
  88.                 int temp2 = stringIntCast(temp2_s);
  89.                 digits.push_back(temp2);
  90.             }
  91.         } while(i >= check);
  92.     }
  93.     BigInteger(const int a) {
  94.         int copy = a;
  95.         if (copy < 0) {
  96.             is_positive = false;
  97.             copy *= -1;
  98.         } else {
  99.             is_positive = true;
  100.         }
  101.         while (copy != 0) { ///0 представляется как ничего
  102.             digits.push_back(copy % calc_system);
  103.             copy /= calc_system;
  104.         }
  105.     }
  106.  
  107.     BigInteger& operator=(const BigInteger& a) {
  108.         digits = a.digits;
  109.         is_positive = a.is_positive;
  110.         return *this;
  111.     }
  112.  
  113.     explicit operator bool() const { ///оператор преобразования
  114.         return (is_positive && (*this != 0));
  115.     }
  116.  
  117.     BigInteger& operator+=(const BigInteger& a);
  118.     BigInteger& operator-=(const BigInteger& a);
  119.     BigInteger& operator*=(const BigInteger& a);
  120.     BigInteger& operator/=(const BigInteger& a);
  121.     BigInteger& operator%=(const BigInteger& a);
  122.  
  123.     std::string toString() const {
  124.         std::string s;
  125.         if (digits.size() == 0) {
  126.             s = "0";
  127.         } else {
  128.             if (!is_positive) {
  129.                 s.push_back('-');
  130.             }
  131.             for (size_t i = digits.size() - 1; i + 1 != 0; --i) {
  132.                 if (digits[i] != 0) {
  133.                     std::string temp_s = std::to_string(digits[i]);
  134.                     s += temp_s;
  135.                 }
  136.                 if (i != 0) {
  137.                     for (int k = 1; k <= calc - how_many_digits(digits[i - 1]); ++k) {
  138.                         s += "0";
  139.                     }
  140.                 }
  141.             }
  142.         }
  143.         return s;
  144.     }
  145.  
  146.     friend std::istream& operator>>(std::istream&, BigInteger&);
  147.     friend bool operator==(const BigInteger&, const BigInteger&);
  148.     friend bool operator<(const BigInteger&, const BigInteger&);
  149.     BigInteger& operator++() { ///префиксный ++i
  150.         *this += 1;
  151.         return *this;
  152.     }
  153.     BigInteger operator++(int) { ///постфиксный i++
  154.         BigInteger copy = *this;
  155.         *this += 1;
  156.         return copy;
  157.     }
  158.     BigInteger operator--() { ///--i
  159.         *this -= 1;
  160.         return *this;
  161.     }
  162.     BigInteger operator--(int) { ///i--
  163.         BigInteger copy = *this;
  164.         *this -= 1;
  165.         return copy;
  166.     }
  167.     BigInteger operator-() const {
  168.         BigInteger copy = *this;
  169.         copy.is_positive = !is_positive;
  170.         return copy;
  171.     }
  172.  
  173.     BigInteger sign() const {
  174.         if (is_positive) {
  175.             return 1;
  176.         }
  177.         return -1;
  178.     }
  179. };
  180.  
  181. std::istream& operator>>(std::istream& in, BigInteger& a) {
  182.     std::string temp_s;
  183.     in >> temp_s;
  184.     a = BigInteger(temp_s);
  185.     return in;
  186. }
  187. std::ostream& operator<<(std::ostream& out, BigInteger a) {
  188.     out << a.toString();
  189.     return out;
  190. }
  191.  
  192. bool operator==(const BigInteger& a, const BigInteger& b) {
  193.     if (a.is_positive != b.is_positive) {
  194.         return false;
  195.     } else {
  196.         size_t size_a = a.digits.size();
  197.         size_t size_b = b.digits.size();
  198.         if (size_a != size_b) {
  199.             return false;
  200.         } else {
  201.             for (size_t i = 0; i < size_a; ++i) {
  202.                 if (a.digits[i] != b.digits[i]) {
  203.                     return false;
  204.                 }
  205.             }
  206.             return true;
  207.         }
  208.     }
  209. }
  210. bool operator<(const BigInteger& a, const BigInteger& b) {
  211.     if (a.is_positive == b.is_positive) {
  212.         size_t size_a = a.digits.size(), size_b = b.digits.size();
  213.         if (size_a == size_b) {
  214.             for (size_t i = size_a - 1; i + 1 != 0; --i) {
  215.                 if (a.digits[i] > b.digits[i]) {
  216.                     return false;
  217.                 }
  218.                 if (a.digits[i] < b.digits[i]) {
  219.                     return true;
  220.                 }
  221.             }
  222.             return false;
  223.         } else {
  224.             return !(size_a > size_b);
  225.         }
  226.     } else {
  227.         return !a.is_positive;
  228.     }
  229. }
  230. bool operator!=(const BigInteger& a, const BigInteger& b) {
  231.     return !(a==b);
  232. }
  233. bool operator>(const BigInteger& a, const BigInteger& b) {
  234.     return b < a;
  235. }
  236. bool operator<=(const BigInteger& a, const BigInteger& b) {
  237.     return a < b || a == b;
  238. }
  239. bool operator>=(const BigInteger& a, const BigInteger& b) {
  240.     return b <= a;
  241. }
  242.  
  243. BigInteger& BigInteger::operator-=(const BigInteger &a) {
  244.     if (is_positive && a.is_positive) {
  245.         if (*this >= a) {
  246.             for (size_t i = 0; i < a.digits.size(); ++i) {
  247.                 digits[i] = digits[i] - a.digits[i];
  248.                 if (digits[i] < 0) {
  249.                     --digits[i + 1];
  250.                     digits[i] += calc_system;
  251.                 }
  252.             }
  253.             size_t last_num = digits.size() - 1;
  254.             if (digits.size() == 0) {
  255.                 last_num = 0;
  256.             }
  257.             for (size_t i = 0; i < last_num; ++i) {
  258.                 if (digits[i] < 0) {
  259.                     --digits[i + 1];
  260.                     digits[i] += calc_system;
  261.                 }
  262.             }
  263.             delete_nulls();
  264.         } else {
  265.             BigInteger copy = a;
  266.             copy -= *this;
  267.             *this = copy;
  268.             is_positive = false;
  269.         }
  270.     } else if (is_positive && !a.is_positive) {
  271.         *this += -a;
  272.     } else if (!is_positive && !a.is_positive) {
  273.         BigInteger copy = -a;
  274.         is_positive = true;
  275.         copy -= *this;
  276.         *this = copy;
  277.     } else if (!is_positive && a.is_positive) {
  278.         is_positive = true;
  279.         *this += a;
  280.         is_positive = false;
  281.     }
  282.     return *this;
  283. }
  284.  
  285. BigInteger& BigInteger::operator+=(const BigInteger &a) {
  286.     if (is_positive && a.is_positive) {
  287.         size_t size = digits.size(), size_a = a.digits.size();
  288.         size_t delta_size = size_a - size;
  289.         if (size > size_a) {
  290.             delta_size = 0;
  291.         }
  292.         for (size_t i = 1; i <= delta_size + 1; ++i) { ///решаем проблему с нулями
  293.             digits.push_back(0);
  294.         }
  295.         //digits.push_back(0); ///потому что при сложении может вылезти на один разряд (на один ли)
  296.         for (size_t i = 0; i < size_a; ++i) {
  297.             digits[i+1] += (digits[i] + a.digits[i]) / calc_system;
  298.             digits[i] = (digits[i] + a.digits[i]) % calc_system;
  299.         }
  300.         for (size_t i = size_a; i < digits.size() - 1; ++i) { /// -1 тут тк мы прибавили 0 для переходного разряда
  301.             digits[i+1] += digits[i] / calc_system;
  302.             digits[i] = digits[i] % calc_system;
  303.         }
  304.         delete_nulls();
  305.     }
  306.     if (!is_positive && !a.is_positive) {
  307.         is_positive = true;
  308.         *this += -a;
  309.         is_positive = false;
  310.     }
  311.     if (!is_positive && a.is_positive) {
  312.         BigInteger copy = a;
  313.         is_positive = true;
  314.         copy -= *this;
  315.         *this = copy;
  316.     }
  317.     if (is_positive && !a.is_positive) {
  318.         *this -= -a;
  319.     }
  320.     return *this;
  321. }
  322.  
  323. BigInteger& BigInteger::operator*=(const BigInteger& a) {
  324.     if (a == 0) {
  325.         is_positive = true;
  326.         return (*this = 0);
  327.     }
  328.     size_t size_a = a.digits.size(), my_start_size = digits.size();
  329.     for (size_t i = my_start_size; i < my_start_size + size_a - 1; ++i) {
  330.         digits.push_back(0);
  331.     }
  332.     for (size_t i = digits.size() - 1; i + 1 != 0; --i) {
  333.         long long start_val = digits[i];
  334.         for (size_t j_my = std::min(i, my_start_size); j_my + 1 != 0; --j_my) {
  335.             size_t j_a = i - j_my;
  336.             if (j_a == size_a) {
  337.                 break;
  338.             }
  339.             digits[i] += digits[j_my] * a.digits[j_a];
  340.             size_t k = i;
  341.             while (digits[k] >= calc_system) {
  342.                 if (k == digits.size() - 1) {
  343.                     digits.push_back(0);
  344.                 }
  345.                 int carry = digits[k] / calc_system;
  346.                 digits[k] %= calc_system;
  347.                 ++k;
  348.                 digits[k] += carry;
  349.             }
  350.         }
  351.         digits[i] -= start_val;
  352.     }
  353.     size_t last_num = digits.size() - 1;
  354.     if (digits.size() == 0) {
  355.         last_num = 0;
  356.     }
  357.     for (size_t i = 0; i < last_num; ++i) {
  358.         if (digits[i] >= 0) {
  359.             int carry = digits[i] / calc_system;
  360.             digits[i] %= calc_system;
  361.             digits[i + 1] += carry;
  362.         } else {
  363.             digits[i] += calc_system;
  364.             --digits[i + 1];
  365.         }
  366.     }
  367.     delete_nulls();
  368.     is_positive = (is_positive == a.is_positive);
  369.     return *this;
  370. }
  371.  
  372. BigInteger &BigInteger::operator/=(const BigInteger &div_number) {
  373.     BigInteger copy_div = div_number;
  374.     bool start_sign = is_positive;
  375.     is_positive = true, copy_div.is_positive = true; ///чтобы при сравнении не было проблем со знаками
  376.     BigInteger current_div(0); //текущее делимое
  377.     BigInteger quotient(0); //частное
  378.     for (size_t i = digits.size(); i + 1 != 0; --i) {
  379.         int left_pos = 0;
  380.         int right_pos = calc_system;
  381.         while (left_pos + 1 != right_pos) {
  382.             int middle = (left_pos + right_pos) >> 1;
  383.             if (middle * copy_div <= current_div) {
  384.                 left_pos= middle;
  385.             } else {
  386.                 right_pos = middle;
  387.             }
  388.         }
  389.         quotient.digits.push_back(left_pos);
  390.         current_div -= (left_pos * copy_div);
  391.         if (i > 0) {
  392.             current_div = digits[i - 1] + calc_system * current_div;
  393.         }
  394.     }
  395.     size_t last_num = quotient.digits.size() - 1;
  396.     for (size_t j = 0; 2 * j <= last_num; ++j) {
  397.         std::swap(quotient.digits[j], quotient.digits[last_num - j]);
  398.     }
  399.     quotient.delete_nulls();
  400.     *this = quotient;
  401.     is_positive = (start_sign == div_number.is_positive);
  402.     return *this;
  403. }
  404.  
  405. BigInteger &BigInteger::operator%=(const BigInteger &div_number) {
  406.     BigInteger copy = *this;
  407.     copy /= div_number;
  408.     *this = (*this - copy * div_number);
  409.     return *this;
  410. }
  411.  
  412. BigInteger operator+(const BigInteger& a, const BigInteger& b) {
  413.     BigInteger copy = a;
  414.     copy += b;
  415.     return copy;
  416. }
  417. BigInteger operator-(const BigInteger& a, const BigInteger& b) {
  418.     BigInteger copy = a;
  419.     copy -= b;
  420.     return copy;
  421. }
  422. BigInteger operator*(const BigInteger& a, const BigInteger& b) {
  423.     BigInteger copy = a;
  424.     copy *= b;
  425.     return copy;
  426. }
  427. BigInteger operator/(const BigInteger& a, const BigInteger& b) {
  428.     BigInteger copy = a;
  429.     copy /= b;
  430.     return copy;
  431. }
  432. BigInteger operator%(const BigInteger& a, const BigInteger& b) {
  433.     BigInteger copy = a;
  434.     copy %= b;
  435.     return copy;
  436. }
  437.  
  438. class Rational;
  439.  
  440. bool operator< (const Rational& a, const Rational& b);
  441.  
  442. class Rational {
  443. private:
  444.     BigInteger numerator = 0; ///числитель
  445.     BigInteger denominator = 1;
  446.     ///когда тормозится обычный алгоритм евклида
  447.     static BigInteger gcd(const BigInteger a, const BigInteger b) {
  448.         if (a == b || b == 0) {
  449.             return  a;
  450.         }
  451.         if (a == 0) {
  452.             return b;
  453.         }
  454.         if (a % 2 == 0 && b % 2 == 0) {
  455.             return 2 * gcd(a/2, b/2);
  456.         }
  457.         if (a % 2 == 0) {
  458.             return gcd(a/2, b);
  459.         }
  460.         if (b % 2 == 0) {
  461.             return gcd(a, b/2);
  462.         }
  463.         if (a < b) {
  464.             return gcd((b - a)/2, a); ///делим на 2 чтобы сразу пропустить след шаг
  465.         }
  466.         return gcd((a - b)/2, b);
  467.     } ///как работает алгоритм евклида для отрицательных
  468.     void reduce() { ///сокращает на gcd и делает так что - только в числителе может быть
  469.         if (numerator.sign() != denominator.sign()) {
  470.             numerator *= denominator.sign();
  471.             denominator *= denominator.sign();
  472.         } else {
  473.             denominator *= denominator.sign();
  474.             numerator *= numerator.sign();
  475.         }
  476.         BigInteger div = gcd(numerator * numerator.sign(), denominator);
  477.         numerator /= div;
  478.         denominator /= div;
  479.     }
  480. public:
  481.     BigInteger getNumerator() const { ///если по ссылке верну то смогу ли я менять потом?
  482.         return numerator;
  483.     }
  484.     BigInteger getDenominator() const {
  485.         return denominator;
  486.     }
  487.     Rational() = default;
  488.     Rational(const int a): numerator(a) {}
  489.     Rational(const BigInteger& a): numerator(a) {} ///если подать инт то всё скастуется тк есть конструктор бигинта из инта
  490.     Rational(const Rational& a) = default; ///если не прописать то не было бы копирования???
  491.  
  492.     Rational& operator+=(const Rational& a) {
  493.         numerator *= a.denominator;
  494.         numerator += a.numerator * denominator;
  495.         denominator *= a.denominator;
  496.         reduce();
  497.         return *this;
  498.     }
  499.     Rational& operator-=(const Rational& a) {
  500.         numerator *= a.denominator;
  501.         numerator -= a.numerator * denominator;
  502.         denominator *= a.denominator;
  503.         reduce();
  504.         return *this;
  505.     }
  506.     Rational& operator*=(const Rational& a) {
  507.         numerator *= a.numerator;
  508.         denominator *= a.denominator;
  509.         reduce();
  510.         return *this;
  511.     }
  512.     Rational& operator/=(const Rational& a) { ///что с делением на 0?
  513.         numerator *= a.denominator;
  514.         denominator *= a.numerator;
  515.         reduce();
  516.         return *this;
  517.     }
  518.     Rational operator-() const {
  519.         Rational copy(*this);
  520.         copy *= -1;
  521.         return copy;
  522.     }
  523.     std::string toString() const { ///ИДЕЯ: использовать toString из бигинтов
  524.         std::string ans_str = numerator.toString();
  525.         if (denominator != 1) {
  526.             ans_str += "/";
  527.             ans_str += denominator.toString();
  528.         }
  529.         return ans_str;
  530.     }
  531.     std::string asDecimal(size_t precision) const {
  532.         std::string ans_str;
  533.         if (*this < 0) {
  534.             ans_str += "-";
  535.         }
  536.         BigInteger first(numerator * numerator.sign());
  537.         first /= denominator;
  538.         ans_str += first.toString() + ".";
  539.         BigInteger div = numerator * numerator.sign() % denominator;
  540.         for (size_t i = 1; i <= precision; ++i) {
  541.             ans_str += (div * 10 / denominator).toString();
  542.             div = div * 10 % denominator;
  543.         }
  544.         return ans_str;
  545.     }
  546.  
  547.     explicit operator double() const {
  548.         return atof(asDecimal(50).c_str());
  549.     }
  550. };
  551.  
  552. bool operator==(const Rational& a, const Rational& b) { ///на данном этапе все дроби сокращены и - только вверху может быть
  553.     if (a.getNumerator() == 0 && b.getNumerator() == 0) {
  554.         return true;
  555.     }
  556.     return (a.getNumerator() == b.getNumerator() && a.getDenominator() == b.getDenominator());
  557. }
  558. bool operator!=(const Rational& a, const Rational& b) {
  559.     return !(a == b);
  560. }
  561. bool operator<(const Rational& a, const Rational& b) {
  562.     if (a.getNumerator().sign() != b.getNumerator().sign()) {
  563.         return (b.getNumerator().sign() == 1);
  564.     }
  565.     return (a.getNumerator() * b.getDenominator() < b.getNumerator() * a.getDenominator());
  566. }
  567. bool operator>(const Rational& a, const Rational& b) {
  568.     return b < a;
  569. }
  570. bool operator<=(const Rational& a, const Rational& b) {
  571.     return (a < b || a == b);
  572. }
  573. bool operator>=(const Rational& a, const Rational& b) {
  574.     return (a > b || a == b);
  575. }
  576.  
  577. Rational operator+(const Rational& a, const Rational& b) {
  578.     Rational copy(a);
  579.     copy += b;
  580.     return copy;
  581. }
  582. Rational operator-(const Rational& a, const Rational& b) {
  583.     Rational copy(a);
  584.     copy -= b;
  585.     return copy;
  586. }
  587. Rational operator*(const Rational& a, const Rational& b) {
  588.     Rational copy(a);
  589.     copy *= b;
  590.     return copy;
  591. }
  592. Rational operator/(const Rational& a, const Rational& b) {
  593.     Rational copy(a);
  594.     copy /= b;
  595.     return copy;
  596. }
  597.  
  598. std::ostream& operator<<(std::ostream& out, const Rational& a) {
  599.     std::string temp_s = a.toString();
  600.     out << temp_s;
  601.     return out;
  602. }
  603.  
  604. int main() {
  605.     BigInteger b, k;
  606.     b = 0, k = 1234567;
  607.     std::ostringstream oss;
  608.     oss << b << ' ' << k;
  609.     if (oss.str() != "0 1234567") {
  610.         std::cerr<<("Assignment from int, or stream output failed.\n");
  611.     }
  612.  
  613.     BigInteger a = b;
  614.     a = -a;
  615.     std::string testString = a.toString() + " " + (-k).toString();
  616.     if (testString != "0 -1234567") {
  617.         std::cerr<<("Unary minus or toString method failed.\n");
  618.     }
  619.  
  620.     a = 999, b = 1000;
  621.     a = a += a;
  622.     testString = a.toString();
  623.     if (testString != "1998") {
  624.         std::cerr<<("Operator = or += failed.\n");
  625.     }
  626.     ++a %= a /= a *= a -= b++;
  627.     std::ostringstream oss2;
  628.     oss2 << 5+a << ' ' << 1-b; // 5 -1000
  629.     if (oss2.str() != "5 -1000") {
  630.         std::cerr<<oss2.str();
  631.     }
  632.  
  633.     std::ostringstream oss3;
  634.     oss3 << (a = (bool(a) ? -1 : -2));
  635.     if (oss3.str() != "-2") {
  636.         std::cerr<<("BigIntegerests failed.\n");
  637.     }
  638.  
  639.     std::istringstream iss("26 5");
  640.     iss >> a >> b;
  641.     std::ostringstream oss4;
  642.     oss4 << b << ' ' << a << ' ';
  643.     if (oss4.str() != "5 26 ") {
  644.         std::cerr<<("Stream input or output failed.\n");
  645.     }
  646.  
  647.     oss4 << a+b << ' ' << a-b << ' ' << a*b << ' ' << a/b << ' ' << a%b << '\n';
  648.     oss4 << b+a << ' ' << b-a << ' ' << b*a << ' ' << b/a << ' ' << b%a;
  649.     if (oss4.str() != "5 26 31 21 130 5 1\n31 -21 130 0 5") {
  650.         std::cerr<<("Arithmetic operations failed.\n");
  651.     }
  652.  
  653.     std::vector<BigInteger> v;
  654.     for (size_t i = 0; i < 1000; ++i) {
  655.         v.push_back(1000 - i);
  656.     }
  657.     std::sort(v.begin(), v.end());
  658.  
  659.     std::ostringstream oss5;
  660.     oss5 << v[0] << ' ' << v[500] << ' ' << v[999] << ' ';
  661.  
  662.     oss5 << (a != b) << ' ' << (a < b) << ' ' << (a > b) << ' ';
  663.     oss5 << (a <= b) << ' ' << (a >= b);
  664.     if (oss5.str() != "1 501 1000 1 0 1 0 1") {
  665.         std::cerr<<("Rationalelation operations failed.\n");
  666.     }
  667.     std::istringstream iss2("1000000000000000000000000000000000 -1000000");
  668.     iss2 >> a >> b;
  669.     std::ostringstream oss6;
  670.     oss6 << b << a;
  671.     if (oss6.str() != "-10000001000000000000000000000000000000000") {
  672.         std::cerr<<("Stream input or output failed.\n");
  673.     }
  674.  
  675.     std::istringstream iss3("453234523460009834520987234598234502345987029345436345634563 "
  676.                             "234523452034623049872345234520983475325345234232578");
  677.     BigInteger c, d;
  678.     iss3 >> c >> d;
  679.  
  680.     std::istringstream iss4("-23534576554950000000000000009999990000999900000 "
  681.                             "8888888888884444444444433333333333332222222222222111112222777777777");
  682.     BigInteger e, f;
  683.     iss4 >> e >> f;
  684.  
  685.     std::ostringstream oss7;
  686.  
  687.     oss7 << a+b << ' ' << c+d << ' ' << e+f;
  688.     if (oss7.str() != "999999999999999999999999999000000 "
  689.                       "453234523694533286555610284470579736866970504670781579867141 "
  690.                       "8888888888884444444420898756778383332222222222212111122221777877777") {
  691.         std::cerr<<("Operatori + failed.\n");
  692.     }
  693.  
  694.     std::ostringstream oss8;
  695.     oss8 << a-b << ' ' << c-d << ' ' << e-f;
  696.     if (oss8.str() != "1000000000000000000000000001000000 "
  697.                       "453234523225486382486364184725889267825003554020091111401985 "
  698.                       "-8888888888884444444467967909888283332222222222232111102223777677777") {
  699.         std::cerr<<("Operator - failed.\n");
  700.     }
  701.  
  702.     std::ostringstream oss9;
  703.     oss9 << a*b << ' ' << c*d << ' ' << e*f;
  704.     if (oss9.str() != "-1000000000000000000000000000000000000000 "
  705.                       "106294125023108851855435239407742287054686671354449187194200406809777590661604024572718537860109672117737393414 "
  706.                       "-209196236043895401881977738593593744982694026094492829962212043149123345328234038901116544451103777729999222300000") {
  707.         std::cerr<<("Operator * failed.\n");
  708.     }
  709.  
  710.     std::ostringstream oss10;
  711.     oss10 << a/b << ' ' << c/d << ' ' << e/f;
  712.     if (oss10.str() != "-1000000000000000000000000000 1932576548 0") {
  713.         std::cerr<<("Operator / failed.\n");
  714.     }
  715.     std::ostringstream oss11;
  716.     oss11 << a%b << ' ' << c%d << ' ' << e%f;
  717.     if (oss11.str() != "0 101894444317458440603421824036688159663989325253819 "
  718.                        "-23534576554950000000000000009999990000999900000") {}
  719.  
  720.     Rational r;
  721.     r = 5;
  722.     r += 3;
  723.     r *= 7;
  724.     b = 15;
  725.     (r /= 8) -= b;
  726.     if (-r != 8)
  727.         std::cerr<<("BigIntegerest 1 failed.\n");
  728.  
  729.     Rational s, t;
  730.     s = Rational(85)/37, t = Rational(29)/BigInteger(-163);
  731.     s += t; ///неправильный числитель
  732.     t = 1;
  733.     for (int i = 0; i < 15; ++i)
  734.         t *= s;
  735.  
  736.     if ((1/t).toString() != "507972178875842800075597772950831264898404875587494819951"
  737.                             "/39717526884730183825748150063721595142668632339785349901549568")
  738.         std::cerr<<("BigIntegerest 2 failed.\n");
  739.     s = 4*3*7*13*19*41*43*11; // 2^2×3×7×13×19×41×43×11
  740.     t = -17*13*23*79;
  741.     s *= s*s, t *= t*t;
  742.     Rational q = s/t;
  743.     if (q.toString() != "-29650611427828166204352/29472131485369")
  744.         std::cerr<<("BigIntegerest 3 failed.\n");
  745.     if (q/1000000000 >= 1)
  746.         std::cerr<<("BigIntegerest 4 failed.\n");
  747.  
  748.     Rational x(0 / q);
  749.     Rational y(0);
  750.     if (x == y) {
  751.         std::cout << "YES";
  752.     }
  753.     q *= t/s;
  754.     if (q != 1 || q.toString() != "1")
  755.         std::cerr<<("BigIntegerest 6 failed.\n");
  756.     s = 4*3*7*13*19*41*43*11;
  757.     t = s - 25; // t=402365939
  758.     s = 1000000007;
  759.     s *= 1000000009;
  760.     s *= 2147483647;
  761.     if ((s/t).asDecimal(10) != "5337140829307966068.3989202202")
  762.         std::cerr<<("BigIntegerest 7 failed.\n");
  763.     t = -t;
  764.     if ((t/s).asDecimal(25) != "-0.0000000000000000001873662")
  765.         std::cerr<<("BigIntegerest 8 failed.\n");
  766. ///0 * отрицательно это будет отрицательным или каким?
  767. }
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement