예제 #1
0
            public static BigInt operator +(BigInt a, BigInt b)
            {
                BigInt sum   = new BigInt(0);
                BigInt aCopy = new BigInt(a);
                BigInt bCopy = new BigInt(b);

                sum.Sign = 1;
                sum.number.Clear();  // знак +, нет никаких элементов

                //выравниваем числа по  длине
                int sizeA = aCopy.number.Count, sizeB = bCopy.number.Count;

                if (sizeA < sizeB)
                {
                    for (int i = 0; i < sizeB - sizeA; i++)
                    {
                        aCopy.number.Insert(0, 0);
                    }
                }
                else if (sizeA > sizeB)
                {
                    for (int i = 0; i < -(sizeB - sizeA); i++)
                    {
                        bCopy.number.Insert(0, 0);
                    }
                }

                sizeA = aCopy.number.Count;

                if (aCopy.Sign * bCopy.Sign == 1)   //  оба числа одного знака
                {
                    int k = 0, w;
                    for (int i = sizeA - 1; i >= 0; i--)
                    {
                        w = Mod(aCopy.number[i] + bCopy.number[i] + k, 10);
                        k = Div(aCopy.number[i] + bCopy.number[i] + k, 10);
                        sum.number.Insert(0, w);
                    }

                    if (k > 0) //  k=0 или k=1
                    {
                        sum.number.Insert(0, k);
                    }
                    if (aCopy.Sign == -1)
                    {
                        sum.Sign = -1;
                    }
                }

                else
                {
                    BigInt bigger;
                    BigInt smaller;
                    if (Abs(aCopy) >= Abs(bCopy))
                    {
                        sum.Sign = aCopy.Sign;
                        bigger   = Abs(aCopy);
                        smaller  = Abs(bCopy);
                    }
                    else
                    {
                        sum.Sign = bCopy.Sign;
                        bigger   = Abs(bCopy);
                        smaller  = Abs(aCopy);
                    }

                    {
                        int k = 0, w;
                        for (int i = sizeA - 1; i >= 0; i--)
                        {
                            w = Mod(bigger.number[i] - smaller.number[i] + k, 10);
                            k = Div(bigger.number[i] - smaller.number[i] + k, 10);
                            sum.number.Insert(0, w);
                        }
                    }
                }

                sum.RemoveBeginZeros();

                return(sum);
            }