高進捗加算と高精度乗算

6211 ワード

正の整数の高精度加算と高精度乗算(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)では,複数の数に1桁を乗じ,直接加算を用いて完成できることを示す.
式(2)では、d*10 nの数のような複数の数を乗算し、複数の数に1桁の数を乗算して処理することができる.
式(3)では、複数の数に複数の数を乗じて、d*10 nのような複数の数と複数の数に1桁を乗じた数の和に変換することができる.
したがって,複数の数に複数の数を乗じた複数の数は最終的にすべて加算で実現できる.
実装コードは次のとおりです.
//
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;
}

減算と除算は続きますが・・・
転載先:https://www.cnblogs.com/Jay-Wong/p/5066865.html