Java中用数组模拟大整数加法与乘法的核心是低位在前存储并手动处理进位:加法逐位相加并传播进位,结果长度至多max(lenA,lenB)+1;乘法按竖式原理将a[i]×b[j]累加到res[i+j],再统一进位,结果长度至多lenA+lenB。

Java 中用数组模拟大整数加法与乘法,核心是把数字按位(通常低位在前)存入 int[] 或 byte[],手动处理进位逻辑。不依赖 BigInteger,适合理解底层运算原理或嵌入式/教学场景。
加法:从低位开始逐位相加 + 进位传播
假设两个大整数以反向数组形式存储(例如 123 → [3,2,1]),长度分别为 lenA、lenB:
- 申请结果数组,长度最多为
Math.max(lenA, lenB) + 1(预留最高位进位空间) - 用索引
i从 0 开始遍历,每次计算:sum = a[i] + b[i] + carry(越界位置补 0) - 当前位结果为
sum % 10,进位为sum / 10 - 循环结束后若仍有
carry > 0,填入最高位
乘法:类竖式计算 + 多轮累加
乘法本质是“多位数 × 单位数”的叠加。设 A(长 m)、B(长 n),结果数组长度最多为 m + n:
- 初始化长度为
m + n的res[],全为 0 - 双层循环:
外层i遍历 A 的每一位(对应 10ⁱ 权值),
内层j遍历 B 的每一位(对应 10ʲ 权值)
则乘积贡献到位置i + j(因为 10ⁱ × 10ʲ = 10ⁱ⁺ʲ) - 每次执行:
res[i + j] += a[i] * b[j];
然后统一做一次进位整理(从低位到高位:`res[k] % 10` 保留,`res[k] / 10` 加给 `res[k+1]`)
关键细节与优化建议
实际编码时注意这些易错点:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
数组方向要一致:推荐低位在索引 0(即
[个位, 十位, 百位...]),否则进位方向易反 - 去除前导零:计算完需从高位(最大索引)往回找第一个非零位,确定有效长度;若全零则结果为 0
-
避免重复进位开销:乘法中可边乘边进位(内层循环后立即处理
i+j和i+j+1),但更清晰的做法是乘完再统一进位 -
用 int[] 而非 char[]:直接存数字值(0–9),避免字符转换(如
c - '0'),减少出错
简单示例:123 + 456 模拟过程
A = [3,2,1],B = [6,5,4],carry = 0
- i=0: 3+6+0 = 9 → res[0]=9, carry=0
- i=1: 2+5+0 = 7 → res[1]=7, carry=0
- i=2: 1+4+0 = 5 → res[2]=5, carry=0
- 结束,无剩余进位 → res = [9,7,5] → 转正序输出为 "579"
注意:最终输出需将数组倒序打印(或构建时高位在前,但计算逻辑会变复杂)。

















