解题思路:
                面对高精度的数相乘,我们首先想到的是用数组或者字符串,这里我使用的是 vector容器,因为它有个size函数,比较方便。把数存储到容器中是倒序存储的,当结果大于原来输入的数时,可以直接在后面添加,而不是正序一位一位往后退。算法部分是模拟小学学的乘法,用双层for循环把每个数相乘存储到另一个容器里面,然后进行判断,如果数据还没有处理完,就把每一个没处理完的数据 % 10,然后添加到末尾;如果位数在原来的位数里面,就把原来位数上的数字改为 % 10后的。

            步骤:

                1、先把传入的字符串倒序存入到各自的容器A B里

                2、再把每一个数相乘存储到另一个容器C里

                3、对容器C的数据统一处理,如果在循环i在容器C的大小里,就把此时容器对应i的数字改为 % 10(不用在末尾添加),如果循环的i大于等于C的大小,说明数据还没有处理完,需要在容器C末尾添加 % 10的数

                题解不易,希望大家支持一下,点个评分;也希望大佬们指导改正!!!

注意事项:
                1、数据是倒着存进容器里面的,注意边界问题

                2、对数据进行统一时,要考虑数据没有处理完的情况,这时进应该在末尾加上 %10后的结果;反之就需要在原先的位数 %10即可

                3、注意要消除前导零(“”001“”)这种情况
参考代码:

#include #include using namespace std;

vector mul(vector &A,vector &B)
{
    vector C(A.size() + B.size());//定义容器大小
    for(int i = 0;i < A.size();i++)//使用双层for循环,使每一个数与每一个数相乘
    {
        for(int j = 0;j < B.size();j++)
        {
            C[i + j] += A[i] * B[j];//存入到容器C
        }
    }
    for(int i = 0,t = 0;i < C.size() || t;i++)//对这些数据进行处理,t表示进位。循环要么是i没有循环完,要么是t != 0
    {
        t += C[i];
        if(i >= C.size())//如果数据还没有处理完,就说明结果大于原先的位数,需要添加位数
            C.push_back(t % 10);
        else//反之只需要在原先的位数上处理即可
            C[i] = t % 10;
        t /= 10;//表示进位
    }
    while(C.size() > 1 && C.back() == 0)//消除前导零
    {
        C.pop_back();
    }
    return C;
}

int main()
{
    string a,b;
    cin >> a >> b;
    vector A,B;
    for(int i = a.size() - 1;i >= 0;i--)//倒序存进容器里面
    {
        A.push_back(a[i] - '0');
    }
    for(int i = b.size() - 1;i >= 0;i--)
    {
        B.push_back(b[i] - '0');
    }
    auto C = mul(A,B);//等价于 vector C = mul(A,B)
    for(int i = C.size() - 1;i >= 0;i--)
    {
        cout << C[i];
    }
    cout << endl;
    return 0; 
}

附yxc大佬的模板

vector mul(vector &A, vector &B)
{
    vector C(A.size() + B.size());

    for (int i = 0; i < A.size(); i ++ )
        for (int j = 0; j < B.size(); j ++ )
            C[i + j] += A[i] * B[j];

    for (int i = 0, t = 0; i < C.size() || t; i ++ )
    {
        t += C[i];
        if (i >= C.size()) C.push_back(t % 10);
        else C[i] = t % 10;
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}


点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论