大数相乘
题目
代码
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
string multiply(string num1, string num2)
{
string res = "";
if(num1 == "0" || num2 == "0") //若有一个乘数为0,则返回“0”
return "0";
int size1 = num1.size(),size2 = num2.size(); //两个乘数的位数
vector<long long>temp(size1+size2-1); //一个i位数乘以一个j位数,结果至少为i+j-1位数
//每一位进行笛卡尔乘法
for(int i=0; i<size1; i++)
{
int a = num1[i] - '0';
for(int j=0; j<size2; j++)
{
int b = num2[j] - '0';
temp[i+j] += a*b;
}
}
//进行进位处理,注意左侧为高位,右侧为低位
int carry = 0;
for(int i=temp.size()-1; i>=0; i--)
{
int t = temp[i] + carry;
temp[i] = t%10;
int c =temp[i] + '0';
res.insert(res.begin(),c); //将第i位数字保存成字符串中的字符
carry = t/10;
}
//若遍历完仍然有进位
while(carry != 0)
{
int t = carry %10;
char c = t+'0';
carry /= 10;
res.insert(res.begin(),c);
}
return res;
}
};
int main(){
string st1,st2;
cin>>st1;
cin>>st2;
Solution solution_;
string result = solution_.multiply(st1, st2);
cout << result;
return 0;
}