题目
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示
输入例子1:
72106547548473106236 982161082972751393
输出例子1:
70820244829634538040848656466105986748
思路
这道题看完就去上课了,在课上想的时候也没什么好的思路,然后就看了一下其他大佬的做法,发现有一种还是挺聪明的。
我之前的想法是先将字符转化为数字,然后模拟竖式乘法的方法按位计算,但是发现这样比较麻烦,其实可以先把每位的计算的结果先不考虑进位存储起来,然后再从逻辑上运算的最低位依次把进位求出来加到高一位的数字上,最后再转换为字符并显示出来
代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
int n1 = str1.size(), n2 = str2.size();
vector<int> v1, v2;
for (int i = n1 - 1; i >= 0; --i)
{
v1.push_back(str1[i] - '0');
}
for (int i = n2 - 1; i >= 0; --i)
{
v2.push_back(str2[i] - '0');
}
vector<int> v(n1 + n2, 0);
for (int i = 0; i < n1; ++i)
{
for (int j = 0; j < n2; ++j)
{
v[i + j] += v1[i] * v2[j];
}
}
for (int i = 0; i < n1 + n2-1; ++i)
{
v[i + 1] += (v[i] / 10);
v[i] = v[i] % 10;
}
string res;
int m = n1 + n2 - 1;
if (v[n1 + n2 - 1] == 0)
m = n1 + n2 - 2;
for (int i = m; i >= 0; --i)
{
res += (v[i] + '0');
}
cout << res << endl;
}
return 0;
}