Я пытаюсь умножить два числа, используя умножение Карацубы. Мой java-код не работает. Я использовал строку в качестве параметров и аргументов, чтобы мы могли умножать два n-значных числа (n четно). Кроме того, я не хочу использовать long или BigInteger. Пожалуйста, помогите мне понять мою ошибку кода.
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 a = 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); }
}
Не могли бы вы также уточнить мой код.
Переданные на умножение числа - 1234 и 5678
Вывод - 6655870 (неверно)
Вывод должен быть - 7006652 (правильно)
Спасибо
Math.pow(10, length/2)
(иMath.pow(10, 2*(length/2))
). Сделайте несколько примеров вручную (особенно с разной длиной/не степенью двойки). - person greybeard   schedule 20.08.2017String.valueOf(s.substring())
, неоднократно определяете идентичные части входных данных (например,first.substring(0, first.length()/2)
) и не даете имена этим частям: это затрудняет понимание вашего кода и споры о нем. Выберите легкодоступное представление алгоритма Карацубы для справки и назовите переменные для частей соответственно. Большинство поставляется с (крошечным) примером; используйте отладчик для отслеживания шагов вашего кода. Адаптируйте представленный здесь код и определите ссылку. Если вы все еще не можете обнаружить ошибку (их больше), опишите, где именно вы застряли. - person greybeard   schedule 20.08.2017