Advertisement
Guest User

Длинная арифметика

a guest
Sep 21st, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.20 KB | None | 0 0
  1. class Int
  2. {
  3. public:
  4.     Int()//Стандартный конструктор
  5.     {
  6.         octo = false;// Без знака
  7.         size = 0;
  8.     }
  9.  
  10.     Int(__int64 a)// Переопределение типа в Int
  11.     {
  12.         if (a < 0)
  13.         {
  14.             a *= -1;
  15.             octo = true;
  16.         }
  17.         else octo = false;
  18.         size = 0;
  19.         __int64 r;
  20.         r = a;
  21.         while (r)
  22.         {
  23.             numb[size] = r % sys;
  24.             r /= sys;
  25.             size++;
  26.         }
  27.         if (!size)
  28.         {
  29.             numb[0] = 0; size = 1;
  30.         }
  31.     }
  32.  
  33.     Int operator^(Int t);
  34.     Int operator%(Int t);
  35.     Int operator/(Int t);
  36.     Int operator*(Int t);
  37.     Int operator+(Int t);
  38.     Int operator=(string s);
  39.     Int operator=(Int t);
  40.     Int operator-(Int t);
  41.     bool operator>(Int t);
  42.     bool operator<(Int t);
  43.     bool operator==(Int t);
  44.  
  45.     Int sqrt();
  46.     void out();//Метод самовывода
  47.     unsigned __int64 getLast();
  48. private:
  49.     char cmp(Int l, Int r);//Сравнение
  50.     /* Для повышение скорости выполнения деления и извлечения корня */
  51.     Int mul(Int l, Int r, int zerol, int zeror);
  52.     Int add(Int l, Int r, int zerol, int zeror);
  53.     bool more(Int l, Int r, int zero);
  54.  
  55.     int numb[100];// Число
  56.     int size;// Количество чисел
  57.     bool octo;// Знак числа
  58.     static const int sys = (int) 1e9;//Система счисления, в которой происходят операции
  59. };
  60.  
  61. unsigned __int64 Int::getLast()
  62. {
  63.     unsigned __int64 a;
  64.     __int64 sy = sys;
  65.     a = numb[0];
  66.     __int64 qw = numb[1];
  67.     if (size >= 2) a = a + sy * qw;
  68.     qw = numb[2];
  69.     if (size >= 3) if (numb[2] < 10) a = a + sy * sy * qw;
  70.     return a;
  71.     return a;
  72. }
  73.  
  74. char Int::cmp(Int l, Int r)
  75. {
  76.     if (l.size > r.size) return 1;
  77.     if (l.size < r.size) return -1;
  78.     for (int i = l.size - 1; i >= 0; i--)
  79.     {
  80.         if (l.numb[i] > r.numb[i]) return 1;
  81.         if (l.numb[i] < r.numb[i]) return -1;
  82.     }
  83.     return 0;
  84. }
  85.  
  86. Int Int::sqrt()// Реализация бинарного поиска по разрядам
  87. {
  88.     Int a, b, t, c, d, g, h;
  89.     int i, r, l, k, j;
  90.     a.size = (size + 1) / 2;
  91.     c.size = a.size;
  92.     t.size = size;
  93.     c.size = a.size;
  94.     h = "2";
  95.     for (i = a.size - 1; i >= 0; i--, a.size--)
  96.     {
  97.         r = sys;
  98.         l = 0;
  99.         while (l + 1 != r)
  100.         {
  101.             k = (r - l) / 2;
  102.             a.numb[i] = l + k;
  103.             b = mul(a, a, a.size - 1, a.size - 1);
  104.             b = add(t, b, 2 * a.size, 2 * a.size - 2);
  105.             d = mul(g, a, a.size, a.size - 1);
  106.             b = add(d, b, 2 * a.size - 1, 2 * a.size - 2);
  107.             if (more(b, *this, a.size - 1)) r = l + k;
  108.             else l = l + k;
  109.         }
  110.         a.numb[i] = l;
  111.         c.numb[i] = l;
  112.         g = mul(h, c, 0, a.size - 1);
  113.         t = mul(c, c, a.size - 1, a.size - 1);
  114.     }
  115.     return c;
  116. }
  117.  
  118. void Int::out()//Метод самовывода
  119. {
  120.     if (octo) cout << "-";
  121.     int i = size - 1;
  122.     cout << numb[i];
  123.     for (i--; i >= 0; i--)
  124.     {
  125.         cout << setfill('0') << setw(9) << numb[i];
  126.     }
  127. }
  128.  
  129. bool Int::operator>(Int t)
  130. {
  131.     if (cmp(*this, t) == 1) return true;
  132.     return false;
  133. }
  134.  
  135. bool Int::operator<(Int t)
  136. {
  137.     if (cmp(*this, t) == -1) return true;
  138.     return false;
  139. }
  140.  
  141. bool Int::operator==(Int t)
  142. {
  143.     if (!cmp(*this, t)) return true;
  144.     return false;
  145. }
  146.  
  147. Int Int::operator-(Int t)
  148. {
  149.     if ((t.size != 0) || (t.numb[0] != 0)) t.octo = !t.octo;
  150.     return (*this + t);
  151. }
  152.  
  153. bool Int::more(Int l, Int r, int zero)
  154. {
  155.     if (l.size > r.size) return true;
  156.     if (l.size < r.size) return false;
  157.     for (int i = l.size - 1; i >= zero; i--)
  158.     {
  159.         if (l.numb[i] > r.numb[i]) return true;
  160.         if (l.numb[i] < r.numb[i]) return false;
  161.     }
  162.     return false;
  163. }
  164.  
  165. Int Int::operator/(Int t)// Реализация бинарного поиска по разрядам + Отброс конечных нулей
  166. {
  167.     Int a, b;
  168.     int i, r, l, k, zero;
  169.     if (size < t.size) return 0;
  170.     a.size = size - t.size + 1;
  171.     zero = a.size - 1;
  172.     for (i = a.size - 1; i >= 0; i--, zero--)
  173.     {
  174.         r = sys;
  175.         l = 0;
  176.         while (l + 1 != r)
  177.         {
  178.             k = (r - l) / 2;
  179.             a.numb[i] = l + k;
  180.             b = mul(a, t, zero, 0);
  181.             if (more(b, *this, zero)) r = l + k;
  182.             else l = l + k;
  183.         }
  184.         if ((!l) && (a.size == i + 1) && (a.size != 1)) a.size--;
  185.         else a.numb[i] = l;
  186.     }
  187.     return a;
  188. }
  189.  
  190. Int Int::operator^(Int t) // xor не нужен
  191. {
  192.     if (t == 0) return 1;
  193.     if (t == 1) return *this;
  194.     Int a;
  195.     a = *this ^ (t / 2);
  196.     a = a * a;
  197.     if (t % 2 == 1) return (*this) * a;
  198.     else return a;
  199. }
  200.  
  201. Int Int::operator%(Int t)
  202. {
  203.     Int a;
  204.     a = *this / t;
  205.     a = t * a;
  206.     return *this - a;
  207. }
  208.  
  209. Int Int::mul(Int l, Int r, int zerol, int zeror)
  210. {
  211.     Int a;
  212.     a.size = l.size + r.size;
  213.     a.octo = (l.octo == r.octo) ? false : true;
  214.     __int64 u;
  215.     int i, j, d;
  216.     for (i = zerol + zeror; i < a.size; i++) a.numb[i] = 0;
  217.     for (j = zeror; j < r.size; j++)
  218.     {
  219.         for (i = zerol, u = 0; i < l.size; i++)
  220.         {
  221.             a.numb[i + j] += u;
  222.             u = r.numb[j];
  223.             u *= l.numb[i];
  224.             d = a.numb[i + j] / sys;
  225.             a.numb[i + j] %= sys;
  226.             a.numb[i + j] += u % sys;
  227.             u /= sys;
  228.             u += d;
  229.             u += a.numb[i + j] / sys;
  230.             a.numb[i + j] %= sys;
  231.         }
  232.         a.numb[i + j] += u;
  233.     }
  234.     while (!a.numb[a.size - 1] && (a.size > 1 + max(zerol, zeror))) a.size--;
  235.     return a;
  236. }
  237.  
  238. Int Int::operator*(Int t)
  239. {
  240.     return mul(*this, t, 0, 0);
  241. }
  242.  
  243. Int Int::add(Int l, Int r, int zerol, int zeror)// Только плюс
  244. {
  245.     Int a;
  246.     int i, mi, ma, d = 0;
  247.     if (zerol < zeror)
  248.     {
  249.         mi = zerol;
  250.         ma = zeror;
  251.         for (i = mi; i < ma; i++) r.numb[i] = 0;
  252.     }
  253.     else
  254.     {
  255.         mi = zeror;
  256.         ma = zerol;
  257.         for (i = mi; i < ma; i++) l.numb[i] = 0;
  258.     }
  259.     a.octo = l.octo;
  260.     if (l.size < r.size)
  261.     {
  262.         a.size = r.size;
  263.         for (i = mi; i < l.size; i++)
  264.         {
  265.             a.numb[i] = l.numb[i] + r.numb[i] + d;
  266.             d = a.numb[i] / sys;
  267.             if (d)  a.numb[i] %= sys;
  268.         }
  269.         for (; i < a.size; i++)
  270.         {
  271.             a.numb[i] = r.numb[i] + d;
  272.             d = a.numb[i] / sys;
  273.             if (d)  a.numb[i] %= sys;
  274.         }
  275.     }
  276.     else
  277.     {
  278.         a.size = size;
  279.         for (i = mi; i < r.size; i++)
  280.         {
  281.             a.numb[i] = l.numb[i] + r.numb[i] + d;
  282.             d = a.numb[i] / sys;
  283.             if (d)  a.numb[i] %= sys;
  284.         }
  285.         for (; i < a.size; i++)
  286.         {
  287.             a.numb[i] = l.numb[i] + d;
  288.             d = a.numb[i] / sys;
  289.             if (d)  a.numb[i] %= sys;
  290.         }
  291.     }
  292.     if (d)
  293.     {
  294.         a.size++;
  295.         a.numb[i] = d;
  296.     }
  297.     return a;
  298. }
  299.  
  300. Int Int::operator+(Int t)
  301. {
  302.     Int a;
  303.     int i, r = 0;
  304.     if (octo == t.octo)
  305.     {
  306.         return add(*this, t, 0, 0);
  307.     }
  308.     else
  309.     {
  310.         Int b, c;
  311.         int l;
  312.         if (octo)
  313.         {
  314.             b = *this;
  315.             a = t;
  316.         }
  317.         else
  318.         {
  319.             b = t;
  320.             a = *this;
  321.         }
  322.         l = max(a.size, b.size);
  323.         for (i = 0; i < b.size; i++)
  324.         {
  325.             b.numb[i] = sys - b.numb[i] - 1;
  326.         }
  327.         for (; i < l; i++) b.numb[i] = sys - 1;
  328.         for (i = a.size; i < l; i++) a.numb[i] = 0;
  329.         b.size = l;
  330.         b.octo = false;
  331.         c = "1";
  332.         b = b + c;
  333.         a = a + b;
  334.         if (l < a.size)
  335.         {
  336.             a.size = l;
  337.             while (!a.numb[a.size - 1] && (a.size > 1)) a.size--;
  338.         }
  339.         else
  340.         {
  341.             for (i = 0; i < l; i++) a.numb[i] = sys - a.numb[i] - 1;
  342.             while (!a.numb[a.size - 1]) a.size--;
  343.             a = a + c;
  344.             a.octo = true;
  345.         }
  346.  
  347.     }
  348.     return a;
  349. }
  350.  
  351. Int Int::operator=(string s)
  352. {
  353.     int i, j, r = 0;
  354.     __int64 k;
  355.     size = 0;
  356.     if (s[0] == '-') { octo = true; r = 1; }
  357.     for (i = s.length(); i > r; i -= 9, size++)
  358.     {
  359.         for (j = max(i - 9, r), k = 0; j < i; j++)
  360.         {
  361.             k *= 10; k += s[j] - 48;
  362.         }
  363.         numb[size] = k;
  364.     }
  365.     return *this;
  366. }
  367.  
  368. Int Int::operator=(Int t)
  369. {
  370.     octo = t.octo;
  371.     int i;
  372.     for (i = 0; i < t.size; i++) numb[i] = t.numb[i];
  373.     size = t.size;
  374.     return *this;
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement