Я пытаюсь реализовать алгоритм Картсубы в c, я следовал псевдокоду в Википедии , но проблема в том, что я не всегда получаю правильный результат.
здесьреализация:
long long karatsuba(char* a,char* b){
if (atoi(a)<10 || atoi(b)<10)
return atoi(a)*atoi(b);
int m = ((strlen(a)<strlen(b))?strlen(a):strlen(b))/2;
char* high1 = slice(a,0,m);
char* low1 = slice(a,m,strlen(a)-m);
char* high2 = slice(b,0,m);
char* low2 = slice(b,m,strlen(b)-m);
long long z0 = karatsuba(low1,low2);
long long z1 = karatsuba(add(low1,high1),add(low2,high2));
long long z2 = karatsuba(high1,high2);
free(low1);
free(high1);
free(low2);
free(high2);
return (z2*pow(10,m*2))+((z1-z2-z0)*pow(10,m)) + z0;
}
это функция slice
, она используется для разбиения числа на 2:
char* slice(char* s,int a,int n){
char* r = calloc(n+1,sizeof(char));
strncpy(r,s+a,n);
return r;
}
И это функция add
, которая используется длядобавьте 2 числа:
char* add(char* a,char* b){
char* r = calloc((strlen(a)>strlen(b)?strlen(a):strlen(b))+2,sizeof(char));
sprintf(r,"%lld",atoi(a)+atoi(b));
return r;
}
PS: просто из любопытства я видел во многих реализациях использование max (size (num1), size (num2)) вместо min, это нормально и делает этоизменить что-нибудь?