用字符串来表示最后的结果,因为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;
}