高精度乘法-CodeVS

版权声明:本博客内容为原创,若要转载,请注明出处!否则禁止转载! https://blog.csdn.net/wardenjohn/article/details/81254216

今天做了一下高精度的乘法,发现没有什么思路,上网找了一下别人的代码和思路,自己实现了一下,在CodeVS上测试通过了。让我来好好学学这个思路把。先把代码贴上来先: 

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int maxnum=500;
int main(){
    string a;
    string b;
    cin>>a;
    cin>>b;
    vector<int> na;
    vector<int> nb;
    int result[1024]={0};
    for(int i=a.length()-1,j=0;i<a.length();i--,j++) na.push_back((a[i]-'0'));
    for(int i=b.length()-1,j=0;i<b.length();i--,j++) nb.push_back((b[i]-'0'));//这个地方是反过来存储的

    for(int i=0;i<na.size();i++)
        for(int j=0;j<nb.size();j++)
            result[i+j] += na[i]*nb[j];

    int i;
    for(i=0;i<2*maxnum;i++){//进位
        result[i+1] += result[i]/10;
        result[i] = result[i]%10;
    }
    while(result[i] == 0){
        i--;
    }
    if(i<0) cout<<"0";
    for(;i>=0;i--){
        cout<<result[i];
    }
    cout<<endl;
}

这个解决的思路就是模拟乘法,原来的博客里面介绍的核心就是这里:

第i号数相当于其后有i个零,第j号数相当于其后有j个零,所以乘出来的结果中有i+j个零,即存入i+j号位置

一开始,我们需要对其,就是把后面给对其了。加入我们现在输入1024 * 330

我们一开始的乘法就是

1024

 390

------

我们从0开始往前面一位一位的去乘,但是我们在一开始输入以后,我们反向存储,这样输入到了我的vector里面了以后就是:

4201

390

直接从头开始算遍历的时候就是相当于从后面开始计算,免去了对接的问题了

反过来了以后,对于一个数,第n位上面就是说明了后面跟着n-1个0,a[i]后面就是跟着i个0

那么这两个数相乘了以后,后面就跟着i+j个0了;

如上面的例子:

1*9

1后面又3个0,9后面又一个0,这里是相当于1000*90=90000

因此我们就在result[i+j]上面加上这个数,加入加出来的是9*9=81,不管了,先存在这个地方先,说明了后面跟着这么多个零,在这个位置上面的计算结果是81而已

在我们遍历完了了以后,我们的计算就相当于完成一大半了

这个时候,我们需要注意到,在每个位置上面,会出现一个位上面大于10的情况,因为我们计算的时候只是计算了“后面跟了多少个0”的问题而已

所以我们在这里需要进行进位的处理。

对于每一个位上,取这个位的数,%10,求进位,/10,但是得到的商需要添加到后面的那位上面去,每一位进行进位处理,直到“平滑了”

这个时候,我们从后面开始看,如果头是0,说明还没有到这个数的开始,这个时候我们一直往回走直到出现第一个不为零的数的时候,说明我们的数开始了。如果我们滑到i==-1时,还是0,说明前面计算的结果全是0,就是相乘结果为0了

猜你喜欢

转载自blog.csdn.net/wardenjohn/article/details/81254216