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

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -