高精度与高精度的乘法---基础算法

看到一个博主写得不错,我也照猫画虎:)

原因

在计算两个非负整数时,如果位数很大,连 long long 类型都存储不了,就要使用到高精度的乘法

原理

原理依旧是模拟人计算两个数的积,早在小学我们已经学了竖式运算,如图:

高精度与高精度的乘法---基础算法_第1张图片

你有没有从中发现什么,个位与个位的乘积在积的个位上,个位与十位的乘积在积的十位上……我们先将所有的乘积保存下来(用一个数组保存),然后对它进行进位处理就可以得到结果。

另外结果的长度是多少呢?可以从上图得出,不管怎么样,长度的基础是其中一个数的长度,另外一个数的长度是乘的次数,第一次乘不会向左移,所以最终的长度是:数A 的长度 + 数 B的长度 - 1。

步骤

先将数 A 数 B 存储

再将 A、B 每一位的乘积用数组存储

然后对数组进行进位处理,将结果放进答案动态数组

最后打印就好了

代码

#include 
#include 
#include 

using namespace std;

int c[200]; //A和B的位数都小于100位,存储着各个位上的乘积和

vector  mul(vector & A, vector & B)
{
    vector  C;

    for (int i = 0; i < (int)A.size(); i++)
    {
        for (int j = 0; j < (int)B.size(); j++)
        {
            c[i + j ] +=( A[i] * B[j] ); // 下标从0开始,注意下标
        }
    }

    int t = 0; //表示进位
    for (int i = 0; i < (int)(A.size() + B.size()) ; i++) //结果的最大位数就是A.size() + B.size() - 1
    {
        t += c[i];
        C.push_back(t % 10);
        t  /=  10;
    }

    //我看到很多人的代码都有去前导0,可是乘法好像不会出现这种情况
    return C;
}


int main(void)
{
    string a, b;
    cin >> a >> b;

    vector  A, B;

    for (int i = (int)a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //逆序存储
    for (int i = (int)b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');

    auto C = mul(A, B);

    for (int i = (int)C.size() - 1; i >= 0; i--) //逆序打印
    {
        cout << C[i];
    }
    return 0;

}

你可能感兴趣的:(基础算法,算法,c++)