基本原理
模仿手算竖式乘法,这里是一个多位数乘以一个一位数(常规整数可能有多位,但我们将它视为一个整体,不拆开)。
计算 A × b(A 是大整数,b 是常规整数,且 b 非负,通常 b 较小):
- 从 A 的最低位(数组下标0)开始,逐位乘以 b,再加上上一位的进位。
- 当前位的乘积 =
A[i] × b + carry,当前结果位 =(A[i] × b + carry) % 10,新的进位 =(A[i] × b + carry) / 10。 - 处理完 A 的所有位后,如果进位不为0,需要继续向高位添加进位数字(可能不止一位,比如进位是123,要拆成[3,2,1]依次加入)。
- 最后去除结果数组前端的多余零(前导零)。
代码实现
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 字符串 → 小端序 vector
vector<int> strToVec(const string& s) {
vector<int> v;
for (int i = s.size() - 1; i >= 0; --i)
v.push_back(s[i] - '0');
return v;
}
// 高精度 × 低精度 (b 是普通整数,如 int)
vector<int> mul(const vector<int>& a, int b) {
vector<int> c;
int carry = 0;
for (int i = 0; i < a.size() || carry; ++i) {
if (i < a.size()) carry += a[i] * b;
c.push_back(carry % 10);
carry /= 10;
}
// 去除前导零(但结果为零时应保留一个0)
while (c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
// 输出小端序大数
void printVec(const vector<int>& v) {
for (int i = v.size() - 1; i >= 0; --i)
cout << v[i];
cout << endl;
}
int main() {
string s;
int b;
cin >> s >> b;
vector<int> a = strToVec(s);
vector<int> result = mul(a, b);
printVec(result);
return 0;
}