2013-08-29 3 views
-2

Я пытаюсь реализовать алгоритм 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 соответствует нижней части и высокой части

Заранее спасибо за весь ответ

+3

Пожалуйста, научитесь использовать отладчик, это подходящий момент. Также, пожалуйста, очистите свой код перед публикацией здесь: используйте инициализаторы, не бросайте возврат 'malloc', код формата красиво. –

+7

Привет. Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –

+0

Спасибо за ваш ответ, я исправлю это. Juste должен знать, что я использовал valgrind и gdb, и до сих пор не получаю правильный результат, и если я попробую 30 раз 30, я получаю 009 – BigFoot

ответ

0

Вот план о том, как вы отлаживаете.

После каждого шага WRITE DOWN, какой ответ вы ожидали от компьютера.
Затем компьютер покажет вам, какой ответ он на самом деле получил.

Ищите шаг, на котором ожидаемое вами отличается от того, что оно на самом деле получило.

Real* multiplication(const Real* a, const Real* b){ 
    Real* ret; 
    [...] 
    z0=multiplication(low1, low2); 
    assert(z0!=NULL); 
    printf("Step #1: I expected 5, but I actually got %d\n", z0); 

    z2=multiplication(high1, high2); 
    printf("Step #2: I expected 7, but I actually got %d\n", z2); 
    assert(z2!=NULL); 

    z1=subtract(subtract(multiplication(add(low1, high1), add(low2, high2)), z2), z0); 
    printf("Step #3: I expected 3, but I actually got %d\n", z1); 
    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); 
    printf("Step #4: I expected 30, but I actually got %d\n", ret); 
    assert(ret!=NULL); 
    [...]  
    return ret; 
} 

Примечание: Вы должны настроить PRINTF заявления, так как я не знаю, какие ценности ожидать, ни как печатать переменные z0, z1 и z2, потому что вы не ставили достаточно подробно в вашем вопросе.

+0

Большое спасибо за ваш ответ, я попробую это и извиняюсь за плохо сформированный ответ, но я совершенно новый с StackOverflow. – BigFoot

+1

Ну, это не совсем так, как вы отлаживаете - для этого вы обычно используете отладчик. Выполнение «отладки» printf «часто является первым шагом, который предпринимают новые программисты, но, вообще говоря, вы должны использовать правильный инструмент для работы. Использование задней части отвертки в качестве молотка для приведения в действие гвоздя работает в крайнем случае, но это не лучший подход. Короче: * научитесь использовать отладчик *. –

+2

@NikBougalis: Я полностью согласен с тем, что Scriptor должен изучать отладчик, но у меня также создается впечатление, что это будет похоже на просьбу обезьяны летать на космическом шаттле. Вместо этого я просто попрошу его использовать некоторые простые инструменты и надеюсь на личный рост позже. (в конце концов, я начал отлаживать обширные «printfs», когда мне было 13 лет ...в конце концов я понял отладчик). – abelenky

Смежные вопросы