编写Karatsuba分治法大整数乘法函数

输入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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值