public static void Main(string[] args)
Console.WriteLine(karatsuba("545645476547643", "32413356578708785653541254786"));
private static string karatsuba(string num1, string num2)
bool firstNeg = num1[0] == '-';
bool secNeg = num2[0] == '-';
normalizeStrings(ref num1, ref num2);
var result = karatsubaRecursive(num1, num2);
private static string karatsubaRecursive(string num1, string num2)
normalizeStrings(ref num1, ref num2);
return (byte.Parse(num1.Substring(0, 1)) * byte.Parse(num2.Substring(0, 1))).ToString();
var n = (int)Math.Ceiling(num1.Length*0.5f);
var x1 = num1.Substring(0, num1.Length - n);
var x2 = num1.Substring(num1.Length - n);
var y1 = num2.Substring(0, num2.Length - n);
var y2 = num2.Substring(num2.Length - n);
var x1y1 = karatsubaRecursive(x1, y1);
var x2y2 = karatsubaRecursive(x2, y2);
var x1px2 = additionPositive(x1, x2);
var y1py2 = additionPositive(y1, y2);
var x1x2y1y2 = karatsubaRecursive(x1px2, y1py2);
var t1 = subtractionPositive(x1x2y1y2, x1y1);
var t2 = subtractionPositive(t1, x2y2);
var part1 = addZeroes(x1y1, 2 * n);
var part2 = addZeroes(t2, n);
var part12 = additionPositive(part1, part2);
var result = additionPositive(part12, x2y2);
private static string additionPositive(string num1, string num2)
normalizeStrings(ref num1, ref num2);
string result = string.Empty;
for (int i = num1.Length-1; i >=0; i--)
var a = byte.Parse(num1.Substring(i, 1)) + left;
var b = byte.Parse(num2.Substring(i, 1));
result = ((a + b) % 10) + result;
left = (byte)((a + b) / 10);
private static string subtractionPositive(string num1, string num2)
normalizeStrings(ref num1, ref num2);
string result = string.Empty;
for (int i = num1.Length-1; i >= 0; i--)
var a = byte.Parse(num1.Substring(i, 1)) - took;
var b = byte.Parse(num2.Substring(i, 1));
result = ((a - b) % 10) + result;
private static void normalizeStrings(ref string num1, ref string num2)
if (num1.Length > num2.Length)
var sb = new StringBuilder();
for (int i = 0; i < num1.Length-num2.Length; i++)
else if (num2.Length > num1.Length)
var sb = new StringBuilder();
for (int i = 0; i < num2.Length-num1.Length; i++)
private static string negate(string num)
public static string addZeroes(string num, int zeroes)
var sb = new StringBuilder(num);
for (int i = 0; i < zeroes; i++)
var result = sb.ToString();
private static void trimZeroes(ref string num)
for (i = 0; i < num.Length-1; i++)