✖️
高精度乘法
大数 × 一位数 = 竖式乘法:从个位开始,进位往上走
💡 打个比方
还是那张"竖式草稿纸":数组一格存一位数字,下标 0 存个位。
这次是"批发进货":店员从个位那格开始,每一格 × 进货量,把个位写下来,十位当作"进位"递给下一格。
比如 12345 × 6:5×6=30,写 0 进 3;4×6+3=27,写 7 进 2……进位一路往上走。
高精度乘法(大数 × 一位数):大数倒着存进数组,从下标 0 开始逐位处理:t = a[i] × d + 进位,写下 t % 10,进位 = t / 10。
🖼️ 大图看明白
📏 高精度乘法,只要 3 步
- 第 1 步:大数倒着存数组:a[0] = 个位,a[1] = 十位……(和加法、减法一样)。
- 第 2 步:从 i=0 开始逐位:t = a[i] × d + 进位;c[i] = t % 10(写下个位),进位 = t / 10(十位交给下一位)。
- 第 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;末尾的进位要写成新的高位(结果可能多一位)。