public static void Main()
Program p = new Program();
string result = p.multiply("9999","9999");
Console.WriteLine(result);
string multiply(string first, string second)
if (first.Length == 1 || second.Length == 1)
return (int.Parse(first) * int.Parse(second)).ToString();
int cutPos = getCutPosition(first, second);
string a = getFirstPart(first, cutPos);
string b = getSecondPart(first, cutPos);
string c = getFirstPart(second, cutPos);
string d = getSecondPart(second, cutPos);
string ac = multiply(a, c);
string bd = multiply(b, d);
string ab_cd = multiply(stringAddtion(a,b), stringAddtion(c,d));
return calculateResult(ac, bd, ab_cd, b.Length + d.Length);
string calculateResult(string ac, string bd, string ab_cd, int padding)
string term0 = stringSubtraction(stringSubtraction(ab_cd, ac), bd);
string term1 = term0.PadRight(term0.Length + padding / 2, '0');
string term2 = ac.PadRight(ac.Length + padding, '0');
return stringAddtion(stringAddtion(term1, term2), bd);
string getFirstPart(string str, int cutPos)
return str.Remove(str.Length - cutPos);
string getSecondPart(string str, int cutPos)
return str.Substring(str.Length - cutPos);
int getCutPosition(string first, string second)
int min = Math.Min(first.Length, second.Length);
string stringAddtion(string a, string b)
a = a.PadLeft(b.Length, '0');
for (int i = length-1; i >= 0; i--)
int num1 = int.Parse(a.Substring(i, 1));
int num2 = int.Parse(b.Substring(i, 1));
res = (num1 + num2 + carry) % 10;
carry = (num1 + num2 + carry) / 10;
result = result.Insert(0, res.ToString());
result = result.Insert(0, carry.ToString());
return sanitizeResult(result);
string stringSubtraction(string a, string b)
bool resultNegative = false;
if (stringIsSmaller(a,b))
b = b.PadLeft(a.Length, '0');
for (int i = length - 1; i >= 0; i--)
int num1 = int.Parse(a.Substring(i, 1));
int num2 = int.Parse(b.Substring(i, 1));
res = (num1 - num2 - carry);
result = result.Insert(0, res.ToString());
result = sanitizeResult(result);
return result.Insert(0, "-");
bool stringIsSmaller(string a, string b)
char[] arrayA = a.ToCharArray();
char[] arrayB = b.ToCharArray();
for(int i = 0; i < arrayA.Length; i++)
if (arrayA[i] < arrayB[i])
if (arrayA[i] > arrayB[i])
void swap(ref string a, ref string b)
string sanitizeResult(string result)
result = result.TrimStart(new char[] { '0' });