输入1:存放大整数A的字符串,输入2:存放大整数B的字符串。
输出:存放乘法结果C的字符串。
(注:在处理大整数乘法时,由于数值可能非常大,超出了一般编程语言中长整型能够表示的范围,因此直接使用长整型变量来存储和计算大整数往往不可行。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void string_to_int_array(const char *str, int *arr, int len) {
for (int i = 0; i < len; ++i) {
arr[i] = str[len - i - 1] - '0';
}
}
char *int_array_to_string(const int *arr, int len) {
char *result = (char *)malloc((len + 1) * sizeof(char));
result[len] = '\0';
for (int i = 0; i < len; ++i) {
result[i] = arr[i] + '0';
}
return result;
}
char *karatsuba(const char *x, const char *y) {
int len_x = strlen(x);
int len_y = strlen(y);
if (len_x == 0 || len_y == 0) {
return strdup("0");
}
if (len_x == 1 || len_y == 1) {
int num_x = x[0] - '0';
int num_y = y[0] - '0';
char *result = malloc(3 * sizeof(char));
sprintf(result, "%d", num_x * num_y);
return result;
}
int n = (len_x > len_y) ? len_x : len_y;
int m = n / 2;
char *xl = strndup(x, m);
char *xr = strdup(x + m);
char *yl = strndup(y, m);
char *yr = strdup(y + m);
char *p1 = karatsuba(xl, yl);
char *p2 = karatsuba(xr, yr);
char *p3 = karatsuba(add_strings(xl, xr), add_strings(yl, yr));
int len_p1 = strlen(p1);
int len_p2 = strlen(p2);
int len_p3 = strlen(p3);
int max_len = len_p1 + len_p2 + m;
char *result = malloc((max_len + 1) * sizeof(char));
result[max_len] = '\0';
int idx = max_len - 1;
int carry = 0;
int i = len_p2 - 1, j = len_p1 + m - 1, k = len_p3 - 1;
while (i >= 0 || j >= 0 || k >= 0 || carry > 0) {
int sum = carry;
if (i >= 0) sum += p2[i--] - '0';
if (j >= 0) sum += p1[j--] - '0';
if (k >= 0) sum += p3[k--] - '0' * m;
result[idx--] = (sum % 10) + '0';
carry = sum / 10;
}
free(xl);
free(xr