using System.Collections.Generic;
public static void Main()
var res = MultiplyBigIntegers("9999910188888", "123456789").TrimStart('0');
static string MultiplyBigIntegers(string leftIntAsString, string rightIntAsString)
if (leftIntAsString.Length > rightIntAsString.Length)
rightIntAsString = rightIntAsString.PadLeft(leftIntAsString.Length, '0');
if (rightIntAsString.Length > leftIntAsString.Length)
leftIntAsString = leftIntAsString.PadLeft(rightIntAsString.Length, '0');
string result = GetBigProduct(leftIntAsString, rightIntAsString, ref reminder);
return (reminder.ToString() + result).TrimStart('0');
static int GetRightPart(string leftIntAsString, string rightIntAsString)
string a = leftIntAsString.Substring(leftIntAsString.Length - 4, 4);
string c = rightIntAsString.Substring(rightIntAsString.Length - 4, 4);
int aInt = Convert.ToInt32(a);
int cInt = Convert.ToInt32(c);
static string GetMiddlePart(string leftIntAsString, string rightIntAsString, ref int reminder)
if (leftIntAsString.Length < 4 && rightIntAsString.Length < 4)
leftIntAsString = leftIntAsString.PadLeft(4, '0');
rightIntAsString = rightIntAsString.PadLeft(4, '0');
if (leftIntAsString.Length < rightIntAsString.Length)
leftIntAsString = leftIntAsString.PadLeft(rightIntAsString.Length, '0');
if (rightIntAsString.Length < leftIntAsString.Length)
rightIntAsString = rightIntAsString.PadLeft(leftIntAsString.Length, '0');
string a = leftIntAsString.Substring(leftIntAsString.Length - 4, 4);
string b = leftIntAsString.Substring(0, leftIntAsString.Length - 4);
string c = rightIntAsString.Substring(rightIntAsString.Length - 4, 4);
string d = rightIntAsString.Substring(0, rightIntAsString.Length - 4);
if (b.Length > 4 || d.Length > 4)
return GetBigSum(GetBigProduct(a, d, ref fakeInt), GetBigProduct(b, c, ref fakeInt), ref reminder);
int aInt = Convert.ToInt32(a);
int cInt = Convert.ToInt32(c);
int bInt = Convert.ToInt32(b);
int dInt = Convert.ToInt32(d);
int result = aInt * dInt + bInt * cInt + reminder;
reminder = result / 10000;
return (result % 10000).ToString("0000");
static string GetLeftPart(string leftIntAsString, string rightIntAsString, ref int reminder)
if (leftIntAsString.Length <= 4 && rightIntAsString.Length <= 4)
int aInteger = string.IsNullOrEmpty(leftIntAsString) ? 0 : Convert.ToInt32(leftIntAsString);
int cInteger = string.IsNullOrEmpty(rightIntAsString) ? 0 : Convert.ToInt32(rightIntAsString);
int product = aInteger * cInteger + reminder;
reminder = product / 10000;
return (product % 10000).ToString("0000");
return GetBigProduct(leftIntAsString, rightIntAsString, ref reminder);
static string GetBigSum(string leftIntAsString, string rightIntAsString, ref int reminder)
if (leftIntAsString.Length < 4 && rightIntAsString.Length < 4)
leftIntAsString = leftIntAsString.PadLeft(4, '0');
rightIntAsString = rightIntAsString.PadLeft(4, '0');
if (leftIntAsString.Length < rightIntAsString.Length)
leftIntAsString = leftIntAsString.PadLeft(rightIntAsString.Length, '0');
if (rightIntAsString.Length < leftIntAsString.Length)
rightIntAsString = rightIntAsString.PadLeft(leftIntAsString.Length, '0');
string a = leftIntAsString.Substring(leftIntAsString.Length - 4, 4);
string b = leftIntAsString.Substring(0, leftIntAsString.Length - 4);
string c = rightIntAsString.Substring(rightIntAsString.Length - 4, 4);
string d = rightIntAsString.Substring(0, rightIntAsString.Length - 4);
int aInt = Convert.ToInt32(a);
int cInt = Convert.ToInt32(c);
int sum = aInt + cInt + reminder;
if (b.Length > 4 || d.Length > 4)
return GetBigSum(b, d, ref reminder) + (sum % 10000).ToString("0000");
int bInt = string.IsNullOrEmpty(b) ? 0 : Convert.ToInt32(b);
int dInt = string.IsNullOrEmpty(d) ? 0 : Convert.ToInt32(d);
int higherSum = bInt + dInt + reminder;
reminder = higherSum / 10000;
return (higherSum % 10000).ToString("0000") + (sum % 10000).ToString("0000");
static string GetBigProduct(string leftIntAsString, string rightIntAsString, ref int reminder)
if (leftIntAsString.Length <= 4 && rightIntAsString.Length <= 4)
int aInteger = Convert.ToInt32(leftIntAsString);
int cInteger = Convert.ToInt32(rightIntAsString);
int product = aInteger * cInteger + reminder;
reminder = product / 10000;
return (product % 10000).ToString("0000");
if (leftIntAsString.Length < 4 && rightIntAsString.Length < 4)
leftIntAsString = leftIntAsString.PadLeft(4, '0');
rightIntAsString = rightIntAsString.PadLeft(4, '0');
if (leftIntAsString.Length < rightIntAsString.Length)
leftIntAsString = leftIntAsString.PadLeft(rightIntAsString.Length, '0');
if (rightIntAsString.Length < leftIntAsString.Length)
rightIntAsString = rightIntAsString.PadLeft(leftIntAsString.Length, '0');
string a = leftIntAsString.Substring(leftIntAsString.Length - 4, 4);
string b = leftIntAsString.Substring(0, leftIntAsString.Length - 4);
string c = rightIntAsString.Substring(rightIntAsString.Length - 4, 4);
string d = rightIntAsString.Substring(0, rightIntAsString.Length - 4);
int aInt = Convert.ToInt32(a);
int cInt = Convert.ToInt32(c);
int rightSum = GetRightPart(a, c) + reminder;
reminder = rightSum / 10000;
string rightPart = (rightSum % 10000).ToString("0000");
string middlePart = GetMiddlePart(leftIntAsString, rightIntAsString, ref reminder);
string reminderString = middlePart.Substring(0, middlePart.Length - 4);
reminder += string.IsNullOrEmpty(reminderString) ? 0 : Convert.ToInt32(reminderString);
middlePart = middlePart.Substring(middlePart.Length - 4, 4);
string leftPart = GetLeftPart(b, d, ref reminder);
return leftPart + middlePart + rightPart;