public static MplbLongArithm operator -(MplbLongArithm left, MplbLongArithm right) // перегрузка оператора вычитания; реализация вычитания длинных чисел
        {
            if ((left.Value != "NaN" && right.Value != "NaN") || (left.Length >= 0 && right.Length >= 0))
            {
                if (left == right)
                {
                    return(new MplbLongArithm("0"));
                }

                string         delta = "";
                MplbLongArithm result,
                               left_mod  = new MplbLongArithm(left.Module),
                               right_mod = new MplbLongArithm(right.Module);

                if ((left.Sign && right.Sign) ||
                    (!left.Sign && !right.Sign))
                {
                    string greater_mod = (left > right) ? left.Module : right.Module,
                           less_mod    = (left > right) ? right.Module : left.Module;
                    SetWithZeroes(ref greater_mod, ref less_mod);

                    for (int i = greater_mod.Length - 1; i >= 0; i--)
                    {
                        if (greater_mod[i] >= less_mod[i])
                        {
                            delta += (char)((greater_mod[i] - less_mod[i]) + 48);
                        }
                        else
                        {
                            delta += (char)(((greater_mod[i] + 10) - less_mod[i]) + 48);
                            int k = 1;
                            while (greater_mod[i - k] == '0')
                            {
                                greater_mod = greater_mod.Remove(i - k, 1);
                                greater_mod = greater_mod.Insert(i - k, "9");
                                k++;
                            }
                            char temp = (char)(greater_mod[i - k] - 1);
                            greater_mod = greater_mod.Remove(i - k, 1);
                            greater_mod = greater_mod.Insert(i - k, temp.ToString());
                        }
                    }

                    delta = ReverseString(delta);

                    result = new MplbLongArithm(delta);
                    return(((left_mod > right_mod && !left.Sign) ||
                            (left_mod < right_mod && left.Sign)) ? result : !result);
                }

                return((!left.Sign && right.Sign) ? left_mod + right_mod : !(left_mod + right_mod));
            }
            else
            {
                return(new MplbLongArithm("E"));
            }
        }
        public static MplbLongArithm operator *(MplbLongArithm left, MplbLongArithm right) // перегрузка оператора умножениея; реализация умножения длинных чисел
        {
            if ((left.Value != "NaN" && right.Value != "NaN") || (left.Length >= 0 && right.Length >= 0))
            {
                string min = (left > right) ? right.Module : left.Module,
                       max = (left > right) ? left.Module : right.Module;

                string[] terms = new string[min.Length];
                for (int i = 0; i < terms.Length; i++)
                {
                    terms[i] = "";
                }

                for (int i = min.Length - 1; i >= 0; i--)
                {
                    string prod = "00";
                    for (int j = max.Length - 1; j >= 0; j--)
                    {
                        prod = Convert.ToString(((min[i] - 48) * (max[j] - 48)) + (prod[0] - 48));

                        if (prod.Length == 1)
                        {
                            prod = prod.Insert(0, "0");
                        }

                        terms[min.Length - 1 - i] += prod[1];
                    }

                    terms[min.Length - 1 - i] += prod[0];
                    terms[min.Length - 1 - i]  = ReverseString(terms[min.Length - 1 - i]);
                    terms[min.Length - 1 - i] += new string('0', min.Length - 1 - i);
                }

                MplbLongArithm result = new MplbLongArithm(terms[0]);
                for (int i = 1; i < min.Length; i++)
                {
                    result += new MplbLongArithm(terms[i]);
                }

                if (left.Sign && !right.Sign || !left.Sign && right.Sign)
                {
                    return(!result);
                }

                return(result);
            }
            else
            {
                return(new MplbLongArithm("E"));
            }
        }
        public static MplbLongArithm operator !(MplbLongArithm right) // перегрузка оператора !; возвращает длинное число, противоположное данному длинному числу
        {
            MplbLongArithm result = new MplbLongArithm(right);

            if (result[0] == '-')
            {
                result.Value = result.Value.Remove(0, 1);
            }
            else
            {
                result.Value = result.Value.Insert(0, "-");
            }

            return(result);
        }
        public static MplbLongArithm operator +(MplbLongArithm left, MplbLongArithm right) // перегрузка оператора сложения; реализация сложения длинных чисел
        {
            if ((left.Value != "NaN" && right.Value != "NaN") || (left.Length >= 0 && right.Length >= 0))
            {
                MplbLongArithm left_mod  = new MplbLongArithm(left.Module),
                               right_mod = new MplbLongArithm(right.Module);

                if (!left.Sign && !right.Sign)
                {
                    string left_val = left.Value, right_val = right.Value;
                    SetWithZeroes(ref left_val, ref right_val);

                    string result = "";
                    byte   carry = 0, temp = 0;
                    for (int i = left_val.Length - 1; i >= 0; i--)
                    {
                        temp    = (byte)(left_val[i] - 48 + right_val[i] - 48 + carry);
                        carry   = (temp < 10) ? (byte)0 : (byte)1;
                        result += (temp < 10) ? Convert.ToString(temp) : Convert.ToString(temp - 10);
                    }

                    if (carry > 0)
                    {
                        result += 1;
                    }

                    result = ReverseString(result);
                    return(new MplbLongArithm(result));
                }

                if (left.Sign && !right.Sign)
                {
                    return(right_mod - left_mod);
                }

                if (!left.Sign && right.Sign)
                {
                    return(left_mod - right_mod);
                }

                return(!(left_mod + right_mod));
            }
            else
            {
                return(new MplbLongArithm("E"));
            }
        }
        public static MplbLongArithm fact(MplbLongArithm n)
        {
            MplbLongArithm one = new MplbLongArithm("1");

            return((n > one) ? fact(n - one) * n : one);
        }
 public MplbLongArithm(MplbLongArithm number) // конструктор, который принимает дилнное число и делает текущий экземпляр структуры = вх. аргументу
 {
     this = number;
 }