Что плохого в реализации этого алгоритма умножения Карацубы?

Перво-наперво:

~ Это мой первый вопрос по StackOverflow.

~ Я студент университета.

~ Это не моя домашняя задача (я делаю это, чтобы улучшить свое алгоритмическое мышление).

Вот моя реализация, которая продолжает возвращать неправильные ответы. Я пробовал бегать GDB, но был слишком неопытен, чтобы понять, где алгоритм работает неправильно. Пожалуйста помоги:

#include <iostream>
#include <cmath>

using namespace std;

int equalize(string &num1, string &num2){
int len1 = num1.length();
int len2 = num2.length();
if (len1 < len2){
for (int i = 0; i < len2 - len1; i++){
num1 = '0' + num1;
}
return len2;
} else{
for (int i = 0; i < len1 - len2; i++){
num2 = '0' + num2;
}
return len1;
}
}

string add(string num1, string num2){
string result;
int length = equalize(num1, num2);
int carryover = 0;
for (int i = length - 1; i >= 0; i--){
int a = num1[i] - '0';
int b = num2[i] - '0';
int sum = a + b + carryover;
carryover = sum / 10;
sum = sum % 10;
result = to_string(sum) + result;
}
if (carryover)
result = to_string(carryover) + result;
return result;
}

long karatsuba(string num1, string num2){
int n = equalize(num1, num2);
if (n == 0)
return 0;
else if (n == 1){
return (num1[0] - '0') * (num2[0] - '0');
} else{
int primary = n / 2;
int secondary = n - primary;
string A = num1.substr(0, primary);
string B = num1.substr(primary, secondary);
string C = num2.substr(0, primary);
string D = num2.substr(primary, secondary);
long AC = karatsuba(A, C);
long BD = karatsuba(B, D);
long ABCD = karatsuba(add(A, B), add(C, D));
return ((AC * pow(10, 2 * primary)) + ((ABCD - AC - BD) * pow(10, primary)) + (BD));
}
}

int main() {
string a = "111", b = "111";
cout << karatsuba(a, b);
return 0;
}

Ответ вернулся 441 который в идеале должен быть 12321,

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]