码迷,mamicode.com
首页 > 其他好文 > 详细

高进度加法与高精度乘法

时间:2015-12-22 16:07:54      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

正整数的高精度加法和高精度乘法(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;
}

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

高进度加法与高精度乘法

标签:

原文地址:http://www.cnblogs.com/Jay-Wong/p/5066865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!