Advertisement
Vladislav_Bezruk

Some task

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