當前位置: 首頁>>算法&結構>>正文


大整數乘法(高精度乘法)的實現源碼(原創)

問題描述:給定兩個正整數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/zh-tw/article/184.html,未經允許,請勿轉載。