✖️

高精度乘法

大数 × 一位数 = 竖式乘法:从个位开始,进位往上走

💡 打个比方

还是那张"竖式草稿纸":数组一格存一位数字,下标 0 存个位。

这次是"批发进货":店员从个位那格开始,每一格 × 进货量,把个位写下来,十位当作"进位"递给下一格。

比如 12345 × 6:5×6=30,写 0 进 3;4×6+3=27,写 7 进 2……进位一路往上走。

高精度乘法(大数 × 一位数):大数倒着存进数组,从下标 0 开始逐位处理:t = a[i] × d + 进位,写下 t % 10,进位 = t / 10。

🖼️ 大图看明白

12345 × 6:从个位开始,每一位 × 6 + 进位 a[4] a[3] a[2] a[1] a[0](个位) 1 2 3 4 5 × 6 7 4 0 7 0 12345 × 6 = 74070 ✓ 从个位(最右)开始,一位一位算: ① 5×6 = 30 → 写下 0,进位 3 ② 4×6 + 3 = 27 → 写下 7,进位 2 ③ 3×6 + 2 = 20 → 写下 0,进位 2 ④ 2×6 + 2 = 14 → 写下 4,进位 1 ⑤ 1×6 + 1 = 7 → 写下 7,进位 0(结束) 数组视角:倒着存(下标 0 = 个位) a: 5 4 3 2 1 0 1 2 3 4 c: 0 7 0 4 7 倒序输出 c[4..0] → 74070 末尾还有进位时(如 999×9=8991),把它写成新的高位

📏 高精度乘法,只要 3 步

  1. 第 1 步:大数倒着存数组:a[0] = 个位,a[1] = 十位……(和加法、减法一样)。
  2. 第 2 步:从 i=0 开始逐位:t = a[i] × d + 进位;c[i] = t % 10(写下个位),进位 = t / 10(十位交给下一位)。
  3. 第 3 步:循环结束后,如果进位还不是 0,把它写成新的最高位——结果可能比大数多一位。
为什么结果会多一位?t 最大只有 9×9+9 = 90,所以进位永远是一位数,但它可能在最顶上"滚"出新的一位:999 × 9 = 8991,比 999 多一位。这就是乘法的"滚雪球"。

💻 C++ 怎么写

#include <iostream>
#include <string>
using namespace std;

int main() {
    string sa; int d;
    cin >> sa >> d;
    int a[1005] = {}, c[1005] = {};
    int la = sa.length();
    for (int i = 0; i < la; i++)
        a[i] = sa[la - 1 - i] - '0';   // 倒着存:下标 0 = 个位
    int carry = 0;
    for (int i = 0; i < la; i++) {
        int t = a[i] * d + carry;  // 位积 + 进位
        c[i] = t % 10;             // 写下个位
        carry = t / 10;            // 十位向上进
    }
    while (carry) {                // 进位不为 0,多写一位
        c[la] = carry % 10; la++;
        carry /= 10;
    }
    while (la > 1 && c[la-1] == 0) la--;   // 去前导零(×0 的情况)
    for (int i = la - 1; i >= 0; i--) cout << c[i];
    return 0;
}

✋ 你来试试

题目 1:手算 999 × 9,写出每一位"写下什么、进位什么"。
个位:9×9=81 → 写下 1,进位 8;十位:9×9+8=89 → 写下 9,进位 8;百位:9×9+8=89 → 写下 9,进位 8;最后把进位 8 写成新的高位。结果 8991(比 999 多一位)。
题目 2:12345 × 0 会输出什么?代码里"去前导零"那行是干什么的?
每位都是 0×0+0=0,c[0..4] 全是 0,进位也是 0。不去前导零会输出 "00000";跳过前导 0(但至少保留一个 0)后输出 0。这行 while 就是干这个的。
🎯 一句话记住:大数 × 一位数 = 竖式乘法:从个位开始,t = a[i]×d + 进位,写 t%10、进 t/10;末尾的进位要写成新的高位(结果可能多一位)。