#c #algorithm #multiplication #karatsuba
Вопрос:
Мне нужно внедрить алгоритм карацубы в код на языке си для моей домашней работы, и я провел свое исследование и придумал следующий код:
long int karatsuba(long int x,long int y)
{
if((x<10)||(y<10)) \if the numbers have 1 digit, I just multiply them
return x*y;
else
{
long int a, b, c, d, ac, bd, z;
int n=uzunluk(x);
a=floor(x/ust(10, ceil(n/2)));
b=x%ust(10, ceil(n/2));;
c=floor(y/ust(10, ceil(n/2)));
d=y%ust(10, ceil(n/2));;
ac=a*c;
bd=b*d;
z=(a b)*(c d)-ac-bd;
long int res=ust(10, 2*ceil(n/2))*ac ust(10, ceil(n/2))*z bd;
return res;
}
}
int main(void)
{
printf("%ld", karatsuba(837487, 368498));
return 0;
}
ust(x, n) — это функция для получения степени числа x:
long int ust(long x, long n)
{
long int res=1;
int i;
for(i=0; i<n; i )
{
res*=x;
}
return res;
}
И uzunluk(x) получает количество цифр в данном вводе:
int uzunluk(long int x)
{
int lx;
while(x>0)
{
x/=10;
lx =1;
}
return lx;
}
проблема в том, что этот код ничего не печатает 😀
Я был бы рад, если бы кто-нибудь заметил мою ошибку.
Комментарии:
1. Если вы не проверяете весь свой код, ваша
uzunluk
функция неверна, потому что она использует значение неинициализированоlx
при вычислении.2. Целочисленные деления выполняются,
floor(x/ust(10, ceil(n/2)))
и результаты усекаются до целых чисел, поэтому функцияfloor
иceil
не будет работать должным образом.3. В дополнение к ошибкам в реальном алгоритме попробуйте добавить символ
'n'
в конце печатной строки.printf
печально известен тем, что иногда отказывается печатать строки, которые не заканчиваются на а'n'
. Следовательно, линия должна быть лучше:printf("%ldn", karatsuba(837487, 368498));
4. @MikeCAT решил проблему отсутствия печати результата, но теперь это дает неправильный результат. Напечатанный результат-отрицательное целое число, где у меня даже нет отрицательного ввода :d
5. @MahmutMahmudov Пожалуйста, не редактируйте свой код, чтобы исправить ошибки, на которые указывают люди. Теперь их комментарии недействительны.
Ответ №1:
Таким образом, получается, что проблема заключалась в том, что умножение 7-значных чисел не приводит к правильному результату при идентификации длинных целых чисел. Когда я изменил его на long long int, он начал работать должным образом. Спасибо всем вам за вашу помощь