Java实现不同长度单数字整数数组求和的方法问询
Java实现大整数逐位求和(数组形式)
没问题,这本质就是实现大整数的逐位加法——毕竟普通整数类型的长度有限,用数组来模拟超长数字的加法完全贴合你的需求。我给你写一个完整的实现,附带详细解释:
核心设计思路
- 结果数组的长度取两个输入数组的最大值加1:因为两个数相加最多会多一位(比如999+1=1000)
- 从数组的末尾(对应数字的个位)开始遍历:这符合我们平时手动计算加法的顺序,从低位到高位处理
- 逐位相加时要带上进位:每一位的和等于两个对应位的数字加上前一位的进位,当前位结果取和的个位,新的进位取和的十位
- 处理最后的剩余进位:遍历完所有位后,如果还有进位,要把它放到结果数组的最高位
- 移除前导零:如果结果数组的第一位是0,说明我们不需要这个额外的高位,返回去掉前导零的数组
完整代码实现
public class LargeNumberAddition { public static int[] addTwoArrays(int[] arr1, int[] arr2) { // 先校验输入数组的合法性:每个元素必须是0-9的单个数字 validateArray(arr1); validateArray(arr2); // 确定结果数组的最大可能长度:较长数组长度 +1(处理最后的进位) int maxLength = Math.max(arr1.length, arr2.length); int[] result = new int[maxLength + 1]; int carry = 0; int i = arr1.length - 1; int j = arr2.length - 1; int k = result.length - 1; // 从末尾开始逐位相加,直到所有位处理完且无进位 while (i >= 0 || j >= 0 || carry > 0) { int sum = carry; if (i >= 0) { sum += arr1[i--]; } if (j >= 0) { sum += arr2[j--]; } // 当前位的结果(取个位) result[k--] = sum % 10; // 更新进位(取十位) carry = sum / 10; } // 处理前导零:如果结果数组的第一位是0,说明没用到这个高位 if (result[0] == 0) { int[] trimmedResult = new int[maxLength]; System.arraycopy(result, 1, trimmedResult, 0, maxLength); return trimmedResult; } return result; } // 校验输入数组的每个元素是否为0-9的数字 private static void validateArray(int[] arr) { for (int digit : arr) { if (digit < 0 || digit > 9) { throw new IllegalArgumentException("数组元素必须是0-9的单个数字"); } } } // 测试示例 public static void main(String[] args) { // 测试案例1:123 + 98 = 221 int[] num1 = {1, 2, 3}; int[] num2 = {9, 8}; int[] sum1 = addTwoArrays(num1, num2); System.out.print("123 + 98 = "); for (int digit : sum1) { System.out.print(digit); } System.out.println(); // 测试案例2:999 + 1 = 1000 int[] num3 = {9, 9, 9}; int[] num4 = {1}; int[] sum2 = addTwoArrays(num3, num4); System.out.print("999 + 1 = "); for (int digit : sum2) { System.out.print(digit); } System.out.println(); // 测试案例3:0 + 0 = 0 int[] num5 = {0}; int[] num6 = {0}; int[] sum3 = addTwoArrays(num5, num6); System.out.print("0 + 0 = "); for (int digit : sum3) { System.out.print(digit); } } }
代码关键点说明
- 输入校验:
validateArray方法确保每个输入元素都是合法的单个数字,避免无效输入导致错误结果 - 进位处理:循环条件包含
carry > 0,保证即使两个数组都遍历完,剩下的进位也会被处理(比如999+1的情况) - 前导零移除:如果结果数组的第一位是0,说明我们不需要这个额外的高位,通过
System.arraycopy生成去掉前导零的数组返回 - 通用性:不管两个输入数组的长度差多大,都能正确处理,完全支持超长数字的加法
测试输出
运行main方法后,你会得到以下输出:
123 + 98 = 221 999 + 1 = 1000 0 + 0 = 0
内容的提问来源于stack exchange,提问作者Quinton Wallenfang
相关产品推荐
相关产品推荐

