"Учу" длинную арифметику - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Начал пробывать реализовывать длинную арифметику на шарпе, но вышло очень криво, соответственно очень долго(это слабо сказанно). Подскажите как можно оптимизировать. Прошу не писать что-то вроде "Пиши на плюсах" и др. Интересует только шарп. Сумма
 private static string Sum(string F, string S)
        {
            string result="";
            if ((F[0] == '-') && (S[0] != '-')) return Minus(S, F.Remove(0,1));
            if ((F[0] != '-') && (S[0] == '-')) return Minus(F, S.Remove(0,1));
            bool minus = false;
            if ((F[0] == '-') && (S[0] == '-'))
            {
                S = S.Remove(0, 1);
                F = F.Remove(0, 1);
                minus = true;
            }
            int NullsCount=Math.Abs(F.Length-S.Length);
            if (NullsCount != 0)
            {
                if (F.Length<S.Length) F = string.Concat(new string('0', NullsCount), F);
                else S = string.Concat(new string('0', NullsCount), S);
            }
            F = string.Concat("0", F);
            S = string.Concat("0", S);
            string value;
            string ost="0";
            for (int i = F.Length - 1; i >= 0; i--)
            {
                value = (Convert.ToInt32(F[i].ToString()) + Convert.ToInt32(S[i].ToString())+Convert.ToInt32(ost)).ToString();
                if (value.Length == 2)
                {
                    ost = value[0].ToString();
                    result = string.Concat(value[1].ToString(), result);
                }
                else
                {
                    ost = "0";
                    result = string.Concat(value[0].ToString(), result);
                }
            }
            if (result[0] == '0')
            {
                result = result.Remove(0, 1);
            }
            if (minus) result=string.Concat('-', result);
            return result;
        }
Вычитание
 private static string Minus(string F, string S)
        {
            string result = "";
            if ((F[0]!='-')&&(S[0]=='-')) return Sum(F,S.Remove(0,1));
            else if ((F[0]=='-')&&(S[0]!='-')) return Sum(F,string.Concat("-",S));
            if (S[0] == '-') S = S.Remove(0, 1);
            bool minus=false;
            if (LongEq(F, S) == 0) return "0";
            else if (LongEq(F, S) == 2)
                minus = true;
            else minus = false;
            if (F[0] == '-') F = F.Remove(0, 1);
            int NullsCount = Math.Abs(F.Length - S.Length);
            if (NullsCount != 0)
            {
                if (F.Length < S.Length) F = string.Concat(new string('0', NullsCount), F);
                else S = string.Concat(new string('0', NullsCount), S);
            }
            char ost = '0';
            if (minus)
            for (int i = F.Length-1; i >= 0; i--)
            {
                int a = Convert.ToInt16(F[i].ToString());
                int b = Convert.ToInt16(S[i].ToString());
                if (a > b) b += 10;
                result = string.Concat((b-a- System.Convert.ToInt16(ost.ToString())).ToString(),result);
                if (b > 9) ost = '1';
                else ost = '0';
            }
            else
                for (int i = F.Length - 1; i >= 0; i--)
                {
                    int a = Convert.ToInt16(F[i].ToString());
                    int b = Convert.ToInt16(S[i].ToString());
                    if (a < b) a += 10;
                    result = string.Concat((a - b - System.Convert.ToInt16(ost.ToString())).ToString(), result);
                    if (a > 9) ost = '1';
                    else ost = '0';
                }
            if (minus) return string.Concat("-", result);
            else
            return result;
        }
Умножение
private static string TotalUmnoj(string F,string S)
        {
            if ((F == "0") || (S == "0")) return ("0");
            int number = 0;
            if (F.Length < S.Length)
            {
                number = F.Length;
                string buff = F;
                F = S;
                S = buff;
            }
            else number = S.Length;
            string ost="0";
            for (int i = 0; i < number; i++)
            {
                string buff = Umnoj1(F, S[number - i - 1]);
                buff = string.Concat(buff, new string('0', i));
                ost = Sum(ost, buff);
            }
            return ost;
        }
Умножение одного символа на число
private static string Umnoj1(string F, char C)
        {
            string result = "";
            char ch = '0';
            for (int i = F.Length - 1; i >= 0; i--)
            {
                string buff = (Convert.ToInt16(F[i].ToString()) * Convert.ToInt16(C.ToString())+Convert.ToInt16(ch.ToString())).ToString();
                if (buff.Length == 1)
                {
                    result = string.Concat(buff[0], result);
                    ch = '0';
                }
                else
                {
                    result = string.Concat(buff[1], result);
                    ch = buff[0];
                }
            }
            if (ch == '0') return result;
            else
            return string.Concat(ch,result);
        }
Заранее благодарю.

Решение задачи: «"Учу" длинную арифметику»

textual
Листинг программы
BigInteger a=BigInteger.Parse("3423564687135871657687135432403210340354035403540");
BigInteger b=BigInteger.Parse("68716871358703587054038709708570123123078078601312301307890756");
BigInteger c;
//умножение
c=a*b;
//сложение
c=a+b;
//вычитание
c=a-b;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы