高精度乘法(高精乘以低精)

基本原理

模仿手算竖式乘法,这里是一个多位数乘以一个一位数(常规整数可能有多位,但我们将它视为一个整体,不拆开)。

计算 A × b(A 是大整数,b 是常规整数,且 b 非负,通常 b 较小):

  1. 从 A 的最低位(数组下标0)开始,逐位乘以 b,再加上上一位的进位。
  2. 当前位的乘积 = A[i] × b + carry,当前结果位 = (A[i] × b + carry) % 10,新的进位 = (A[i] × b + carry) / 10
  3. 处理完 A 的所有位后,如果进位不为0,需要继续向高位添加进位数字(可能不止一位,比如进位是123,要拆成[3,2,1]依次加入)。
  4. 最后去除结果数组前端的多余零(前导零)。

代码实现

#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;
}