[算法]大数相乘

用字符串来表示最后的结果,因为c++提供的内置数据类型无法直接表示大数的,会有溢出,所以采用字符串存储
复杂度为O(num1.size() * num2.size())=O(n^2)
算法的思想是小学生用的乘法,用一个乘数的每个数字去乘以另外一个数,最后将结果相加,注意移位,因为用第二个数字去乘的时候,其实是要*10的
代码来源于GeeksforGeeks,进行了简单修改


#include <iostream>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
string multiply(string num1, string num2)
{
    int len1 = num1.size();
    int len2 = num2.size();
    if (len1 == 0 || len2 == 0)
        return "0";

    //将结果逆序放在vector中 
    vector<int> result(len1 + len2, 0);
    //用于确定结果的位置
    int i_n1 = 0;
    int i_n2 = 0;
    //遍历num1的每一个数字
    for (int i = len1 - 1; i >= 0; i--)
    {
        int carry = 0;
        int n1 = num1[i] - '0';

        i_n2 = 0;
        //相当于num1的每一个数字乘num2
        //遍历num2的每一个数字
        for (int j = len2 - 1; j >= 0; j--)
        {
            int n2 = num2[j] - '0';
            int sum = n1 * n2 + result[i_n1 + i_n2] + carry;
            carry = sum / 10;
            result[i_n1 + i_n2] = sum % 10;
            i_n2++;
        }
        //判断最高位是否还产生进位
        //如果产生进位,则加上
        if (carry > 0)
            result[i_n1 + i_n2] += carry;

        i_n1++;//左移一位
    }

    //去除最高位的0
    int i = result.size() - 1;
    while (i >= 0 && result[i] == 0)
        i--;

    //如果i到了-1 结果为0
    if (i == -1)
        return "0";

    //产生最后的结果字符串
    string s = "";

    while (i >= 0)
        s += std::to_string(result[i--]);

    return s;
}
void solve(string &str1,string& str2)
{
    //正负号的处理
    if ((str1.at(0) == '-' || str2.at(0) == '-') &&
        (str1.at(0) != '-' || str2.at(0) != '-'))
        cout << "-";


    if (str1.at(0) == '-' && str2.at(0) != '-')
    {
        str1 = str1.substr(1);
    }
    else if (str1.at(0) != '-' && str2.at(0) == '-')
    {
        str2 = str2.substr(1);
    }
    else if (str1.at(0) == '-' && str2.at(0) == '-')
    {
        str1 = str1.substr(1);
        str2 = str2.substr(1);
    }
    cout << multiply(str1, str2);
}
int main()
{
    string str1 = "12352333333333333333";
    string str2 = "171452333333333333333333333";
    solve(str1, str2);
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tailiang/p/11730900.html