题目
给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共一行,包含 A×B 的值。
数据范围
1≤A的长度≤100000
0≤B≤100000
输入样例:
2
3
输出样例:
6
题解
主要思路:
回想小学时的乘法运算规则,我们是逐位对另一个乘数因子做乘法运算的,在这里也一样,我们对每一个因子逐位与另一个乘数进行相乘运算。
需要注意的是在逐位运算的过程中应该设置位权值,来保证运算结果符合位进制规则结果。
还有一点是当结果为0时我们需要进行前导0的清除操作。
一般题目不会设置两个极大的数相乘,但为了保险我还是设置了两个数组进行运算。
来,直接上代码!
#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int>& A, vector<int>& B) {
if (A.size() < B.size())return mul(B, A);//将较大的数放在前面
vector<int> c;
int t = 0;//做进位存储
for (int i = 0; i < A.size(); i++) {
for (int j = 0, x = 1; j < B.size(); j++)
{//这里定义一个x作为进位运算的标志,表示当前运算的权值,即个位十位百位千位等
t += A[i] * B[j] * x;
x *= 10;
}
c.push_back(t % 10);//存入最低位
t /= 10;//保留需要进位继续运算的数
}
while (t) {//若进位数还有剩余,继续存入
c.push_back(t % 10);
t /= 10;
}
while (c.size() > 1 && c[c.size() - 1] == 0)c.pop_back();//清除前导0
return c;
}
int main() {
vector<int> A, B;
string a, b;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - '0');//逆序存入输入数字
while (A.size() > 1 && A[A.size() - 1] == 0)A.pop_back();//清除前导0
for (int i = b.size() - 1; i >= 0; i--)B.push_back(b[i] - '0');//逆序存入输入数字
while (B.size() > 1 && B[B.size() - 1] == 0)B.pop_back();//清除前导0
auto C = mul(A, B);//乘法运算
for (int i = C.size() - 1; i >= 0; i--)printf("%d", C[i]);//输出
cout << endl;
return 0;
}