Advertisement
Vladislav_Bezruk

Some task

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