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); }