[问题描述] 有两个用字符串表示的非常大的大整数,算出它们的乘积,也用字符串表示,不能用系统自带的大整数类型。
[输入描述] 由空格分隔的两个字符串代表输入的两个大整数
[输出描述] 输入的乘积用字符串表示
[输入样例] 72106547548473106236 982161082972751393
[样例输出] 70820244829634538040848656466105986748
[思路] 表示非常大的大整数的两个字符串用string容器str1和str2存放,将各位转换为整数分别存放在a和b数组中,将a的每一位与b的所有位相乘,结果存放在r数组中,最后从最高非0位开始输出r的所有元素。
[程序]
#include <iostream>
#include <string>
using namespace std;
#define N 1002
//问题表示
string str1, str2;
int a[N], b[N];
//求解结果表示
int r[N];
void solve(int a[], int b[], int n, int m)//求a和b相乘的结果r
{
memset(r, 0, sizeof(r));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int k = i + j;//a[i] * b[j]放在r[k]中
r[k] += a[i] * b[j];//对应位数字相乘
while (r[k] > 9)//有进位
{
r[k + 1] += r[k] / 10;
r[k] %= 10;
k++;
}
}
}
}
int main()
{
int i;
while (cin >> str1 >> str2)//输入多个测试用例
{
for (i = 0; i < str1.size(); i++)//str1转化为数字数组a
{
a[i] = str1[str1.size() - 1 - i] - '0';//a[0]....a[str1.size()-1]分别存放个位、十位、百位...
}
for (i = 0; i < str2.size(); i++)
{
b[i] = str2[str2.size() - 1 - i] - '0';
}
solve(a, b, str1.size(), str2.size());
int high = str1.size() + str2.size() - 1;
while (r[high] == 0 && high > 0)//求出非零最高位
{
high--;
}
for (i = high; i >= 0; i--)
{
cout << r[i];
}
cout << endl;
}
return 0;
}