Я пытаюсь реализовать алгоритм karatsuba на языке c, но, к сожалению, это дает мне неправильный результат.Karatsuba неправильный результат
Вот мой с функцией:
Real* multiplication(const Real* a, const Real* b){
Real* ret;
............
z0=multiplication(low1, low2);
assert(z0!=NULL);
z2=multiplication(high1, high2);
assert(z2!=NULL);
z1=subtract(subtract(multiplication(add(low1, high1), add(low2, high2)), z2), z0);
assert(z1!=NULL);
assert((tmpA->taille == tmpB->taille) && (tmpA->taille%2==0));
ret=add(add(powerTen(z2, tmpA->size), powerTen(z1, tmpA->size/2)), z0);
assert(ret!=NULL);
.......
return ret;
}
Я создал структуру:
struct Real{
int* nb;
int size;
int neg; //1=negative 0=positiv
}
Итак, в нескольких словах, я использовал реализацию псевдо-кода из wikipedia, и функция запускает y, глядя на размер двух чисел (если есть < 2), и если он не исправляет его, выравнивая их и добавляя нуль спереди, если размер четный. Помимо этого, это в основном алгоритм псевдокода.
LOW1 и HIGH1 соответствуют нижней части и высокой части LOW2 и HIGH2 соответствует нижней части и высокой части
Заранее спасибо за весь ответ
Пожалуйста, научитесь использовать отладчик, это подходящий момент. Также, пожалуйста, очистите свой код перед публикацией здесь: используйте инициализаторы, не бросайте возврат 'malloc', код формата красиво. –
Привет. Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –
Спасибо за ваш ответ, я исправлю это. Juste должен знать, что я использовал valgrind и gdb, и до сих пор не получаю правильный результат, и если я попробую 30 раз 30, я получаю 009 – BigFoot