高进度加法与高精度乘法

正整数的高精度加法和高精度乘法(C++)

加法运算如下:

// 高精度加法 
string add(string a, string b) {
    // 确保 a >= b 
    if (a.size() < b.size()) {
        string temp = a;
        a = b;
        b = temp;
    }
    int len1 = a.size(), len2 = b.size();
    // a, b前缀补零 ,比如 a = 12345, b = 678时,补零之后 a = 012345,b = 0000678.
    a = '0' + a;
    for (int i = 0; i <= len1-len2; i++) b = "0" + b;

    string sum;
    for (int i = 0; i <= len1; i++) sum += '0';
    int c = 0;  // 进位 
    for (int i = len1; i >= 0; i--) {
        int t = (a[i] - '0')+(b[i] - '0') + c;
        sum[i] += t%10;
        c = t/10;
    }
    // 若最高位进位为0, 则去掉最高位 
    if (sum[0] == '0') sum = sum.substr(1, sum.size());
    return sum;
}

乘法运算建立在加法运算之上,乘法的主要思想是把乘法转化为加法进行运算。

请先看下面的等式:

    12345*4=12345+12345+12345+12345

    12345*20=123450*2

    12345*24=12345*20+12345*4

等式(1)说明,多位数乘一位数,可以直接使用加法完成。

等式(2)说明,多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。

等式(3)说明,多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。

因此,多位数乘多位数最终可以全部用加法来实现。

实现代码如下:

// 高精度乘法 :利用高精度加法实现 
string multi(string a, string b) {
    if (a.size() < b.size()) {
        string temp = a;
        a = b;
        b = temp;
    }
    int len1 = a.size(), len2 = b.size();
    string product = "0";
    for (int i = len2-1; i >= 0; i--) {
        if (i < len2-1) a += "0";
        string temp = a;
        if (b[i] == '0') temp = "0";
        else 
            for (int k = 1; k < b[i]-'0'; k++)
                temp = add(temp, a);
        product = add(product, temp);
    }
    return product;
}

减法和除法待续......

posted on 2015-12-22 15:39  松下风  阅读(570)  评论(0编辑  收藏  举报

导航