algorithm - Karatsuba multiplication java recursion code not working? -


i trying multiply 2 numbers using karatsuba multiplication. java code not working. have used string parameters , arguments can multiply 2 n digit numbers (n even). also, don't want use long or biginteger. please me figure out code mistake.

class karat{  public static string karatsuba(string first, string second){      if(first.length() <= 1 || second.length() <= 1)         return string.valueof(long.parselong(first)*long.parselong(second));      string = karatsuba(first.substring(0, first.length()/2), second.substring(0, second.length()/2));      string b = karatsuba(first.substring(first.length() - first.length()/2, first.length()), second.substring(second.length() - second.length()/2, second.length()));      string c = karatsuba(string.valueof(long.parselong(first.substring(0, first.length()/2)) + long.parselong(first.substring(first.length() - first.length()/2, first.length()))), string.valueof(long.parselong(second.substring(0, second.length()/2)) + long.parselong(second.substring(second.length() - second.length()/2, second.length()))));      string d = string.valueof(long.parselong(c) - long.parselong(b) - long.parselong(a));      return string.valueof(((int)math.pow(10, first.length()))*(long.parselong(a)) + (((int)math.pow(10, first.length()/2))*long.parselong(d)) + (long.parselong(c))); }  public static void main(string[] args){         string result = karatsuba("1234", "5678");         system.out.println(result); } } 

can please refine code.

numbers passed multiplication - 1234 , 5678

output - 6655870 (incorrect)

output should - 7006652 (correct)

thank

interesting algorithm. 1 mistake in

return string.valueof(((int)math.pow(10, first.length()))*(long.parselong(a)) + (((int)math.pow(10, first.length()/2))*long.parselong(d)) + (long.parselong(c))); 

at end, should long.parselong(b) instead of long.parselong(c).

and in intermediate calculations, can happen 2 strings of different lengths. doesn't work correctly.

please, allow comments improve implementation. idea use strings seems allow big numbers, introduce things long.parselong() or (int)math.pow(10, first.length()), limiting long or int range.

if want big numbers, write own string-based addition , power-of-ten multiplication (that 1 being trivial appending zeroes).

and, try avoid names a, b, c, or d - it's easy forget mean, original mistake. e.g. names wikipedia little bit better (using z0, z1 , z2), still not perfect...


Comments

Popular posts from this blog

python - Operations inside variables -

Generic Map Parameter java -

arrays - What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? -