A*B问题
题目描述
计算两个非负整数 A,B 的乘积,A,B 可能会很大。
输入描述
第一行输入一个非负整数 A。
第二行输入一个非负整数 B。
A,B 的长度不大于 500。
输出描述
输出 A ∗ B A*B A∗B 的值。
用例输入 1
4321
1234
用例输出 1
5332114
思路
C++无法直接处理大数相乘,我们需要借助字符串存储数的每一位来实现大整数相乘的运算。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 手搓高精乘(O.o)
string a_s, b_s;
int a[521] = {0}, b[521] = {0}, ans[521 * 2] = {0}; // ans保存做乘法后的结果
int len_a, len_b, len, carry = 0, i, j; // carry为进位
cin >> a_s >> b_s; // 读入a,b对应的字符串
// 记录一开始a和b的数字长度
len_a = a_s.size();
len_b = b_s.size();
for (i = 0; i < len_a; i++)
a[i] = a_s[len_a - 1 - i] - '0'; // 将字符转化为数字保存在数组中,方便后续计算
for (i = 0; i < len_b; i++)
b[i] = b_s[len_b - 1 - i] - '0'; // 将字符转化为数字保存在数组中,方便后续计算
for (i = 0; i < len_b; i++)
{
for (j = 0; j < len_a || carry != 0; j++)
{
ans[i + j] += a[j] * b[i] + carry; // 乘法计算
carry = ans[i + j] / 10; // 处理进位
ans[i + j] %= 10;
}
}
len = i + j; // 乘之后的数字长度
while (ans[len] == 0 && len > 0) // 去掉前导0
len--;
for (i = len; i >= 0; i--) // 输出结果
cout << ans[i];
return 0;
}