当前位置: 首页>>算法&结构>>正文


大整数乘法(高精度乘法)的实现源码(原创)

问题描述:给定两个正整数A,B(A和B可能超出计算机中国INT32,INT64的范围,高达几百甚至上千位),

求A和B相乘的积。

解决方案:

用计算机模拟手算的乘法,假设A和B都用字符串表示,

时间复杂度为:O(strlen(A) * strlen(B));

空间复杂度为:O(strlen(A) + strlen(B));

源码实现如下:


#include 
#include 
#include 

//大整数的乘法
//时间复杂度O(strlen(a) * strlen(b))
//空间复杂度O(strlen(a) + strlen(b))
//a,b都是用字符串表示的正的整数
//例如:a=12345678910, b=10987654321
char* mul(const char *a, const char *b)
{
    //略去对大整数a,b的合法性判断

    int len1 = strlen(a);
    int len2 = strlen(b);
    int len = len1 + len2;
    int i,j,k;
    int *c = (int*)malloc(sizeof(int) * (len - 1));
    memset(c, 0, sizeof(int) * (len - 1));

    //[PS:一个数字减去'0'就是它对应的数值]
    //模拟手算乘法
    for(i = 0; i < len1; ++i)
        for(j = 0; j < len2; ++j)
            c[i + j] += (a[i] - '0') * (b[j] - '0');

    char* r = (char*)malloc(sizeof(char) * (len + 1));
    memset(r, 0, sizeof(char) * (len + 1));

    int carry = 0;
    //按从低位到高位的顺序将每一位的结果存到r中
    for(i = len - 2, k = 0; i >= 0; --i, k++)
    {
        r[k] = (c[i] + carry) % 10 + '0';
        carry = (c[i] + carry) / 10;
    }
    if(carry) r[k++] = carry + '0';

    //将结果r倒置
    for(i = 0, j = k - 1; i < j; i++,j--)
    {
        int tmp = r[i];
        r[i] = r[j];
        r[j] = tmp;
    }

    free(c);
    return r;

}

int main()
{
    const char* a = "12345678910";
    const char* b = "10987654321";
    char * r = mul(a, b);
    printf("%s\n", r);
    free(r);
    system("pause");
    return 0;
}
本文由《纯净天空》出品。文章地址: https://vimsky.com/article/184.html,未经允许,请勿转载。