超大数乘法 详细题解(C++ 版)
2026-04-06 16:48:13
发布于:广东
11阅读
0回复
0点赞
题目分析
题目要求计算两个非负整数的乘积,但每个数最多有 2000 位。
- 普通
int、long long最多存十几位,存不下这么大的数 - 必须用字符串存数字,模拟我们手写竖式乘法来计算
一、核心思路
我们平时笔算乘法是这样的:
1 2 3 (a)
× 4 5 (b)
-------
6 1 5
4 9 2
-------
5 5 3 5
程序模拟步骤:
- 把两个大数用字符串读入
- 为了方便从个位开始算,逆序处理
- 用数组存结果:
a第i位 × b第j位结果放在i+j位置 - 统一处理进位
- 去掉前导 0,逆序输出答案
二、重要规律(必记)
- 两个数长度分别为
n、m,乘积最长为n + m位 a的第i位(从0开始,个位是0) ×b的第j位
→ 结果落在i + j这一位
三、完整代码 + 逐行详解
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
// 结果数组,最大 2000+2000=4000 位,开 4010 足够
const int MAX = 4010;
// 存储乘积每一位,初始全0
int ans[MAX];
int main() {
// 1. 输入两个大数字符串
string s1, s2;
cin >> s1 >> s2;
// 清空答案数组
memset(ans, 0, sizeof(ans));
// 2. 获取两个数字的长度
int len1 = s1.size();
int len2 = s2.size();
// 3. 模拟竖式乘法核心循环
// i 遍历 s1 的每一位(从个位开始)
for (int i = 0; i < len1; i++) {
// 取出 s1 第 i 位数字(逆序取)
int num1 = s1[len1 - 1 - i] - '0';
// j 遍历 s2 的每一位
for (int j = 0; j < len2; j++) {
int num2 = s2[len2 - 1 - j] - '0';
// 乘积累加到 ans[i+j]
ans[i + j] += num1 * num2;
}
}
// 4. 处理进位(关键步骤)
for (int i = 0; i < len1 + len2; i++) {
// 十位及以上进位到下一位
ans[i + 1] += ans[i] / 10;
// 保留个位
ans[i] = ans[i] % 10;
}
// 5. 去掉前导 0
// 从最高位开始找第一个不是0的位置
int pos = len1 + len2 - 1;
while (pos > 0 && ans[pos] == 0) {
pos--;
}
// 6. 逆序输出结果
for (int i = pos; i >= 0; i--) {
cout << ans[i];
}
cout << endl;
return 0;
}
四、每一步详细解释
1. 输入与存储
- 数字太大,用
string存储 - 例如输入
123,字符串是"123"
2. 逆序取数字
- 字符串下标:
0='1', 1='2', 2='3' - 我们要从个位开始乘,个位是最后一位:
s[len-1-i] '0'是字符,减'0'变成整数:'5'-'0' = 5
3. 乘法核心
ans[i + j] += num1 * num2;
- 第 i 位 × 第 j 位 → 放在 i+j 位
- 先把所有乘积加完,最后统一进位
4. 进位处理
ans[i + 1] += ans[i] / 10;
ans[i] %= 10;
- 比如某一位是 25
- 进位:
25/10 = 2给下一位 - 本位:
25%10 = 5
- 进位:
5. 去前导0
- 结果可能是
000535,要变成535 - 从最高位往前扫,遇到 0 就跳过
- 至少保留一位 0,防止结果是 0 时什么都不输出
6. 输出
- 数组里是逆序存的(个位在前)
- 从后往前输出就是正常顺序
五、样例演示
输入:
1
2
len1=1, len2=1i=0, j=0: ans[0] = 1×2 = 2- 进位后还是 2
- 输出 2
输入:
123
45
计算后得到 5535,正确输出。
六、边界情况测试
- 0 × 0 → 输出 0
- 0 × 123456 → 输出 0
- 999...9(2000个9)× 999...9 → 正确输出超大结果
这些情况代码都能正确处理。
七、时间复杂度
- 两层循环:
O(n × m) - 2000 × 2000 = 4,000,000 次运算
- C++ 完全无压力,不会超时
这里空空如也

有帮助,赞一个