大数相乘

129 阅读1分钟

说明:如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。

代码如下:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string BigMultiply(string, string);
int main() {
    string s1, s2;
    //用goto语句测试
p:
    cin >> s1 >> s2;

    string sret = BigMultiply(s1, s2);
    cout << sret << endl<<endl;
    goto p;
    return 0;
}
string BigMultiply(string s1, string s2) {
    //1.反转
    reverse(s1.begin(), s1.end());
    reverse(s2.begin(), s2.end());

    int len1 = s1.length();
    int len2 = s2.length();
    //2.创建两个乘数长度和的存储空间并初始化
    char *res = new char[len1 + len2];
    for (int i = 0; i < len1+len2; i++)
    {
        res[i] = '0';
    }

    //3.具体算法
    for (int j = 0; j < len2; j++) {
        int ad = 0;//进位
        int n2 = s2[j]-'0';//第二个乘数取值
        int i=0;//第一个数`位标志
        for (; i < len1; i++) {
            int r = n2*(s1[i]-'0')+ad+(res[j+i]-'0');
            res[j+i] = r % 10+'0';
            ad = r / 10;
        }
        res[j + i ] += ad;
    }

    //4.返回结果
    string sret(res, len1 + len2);
    sret = sret.substr(0, sret.find_last_not_of('0')+1);
    reverse(sret.begin(), sret.end());
    return sret;
}

运行效果:
大数相乘测试