You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }
    }
}

代码关键点说明

  1. 输入校验:validateArray方法确保每个输入元素都是合法的单个数字,避免无效输入导致错误结果
  2. 进位处理:循环条件包含carry > 0,保证即使两个数组都遍历完,剩下的进位也会被处理(比如999+1的情况)
  3. 前导零移除:如果结果数组的第一位是0,说明我们不需要这个额外的高位,通过System.arraycopy生成去掉前导零的数组返回
  4. 通用性:不管两个输入数组的长度差多大,都能正确处理,完全支持超长数字的加法

测试输出

运行main方法后,你会得到以下输出:

123 + 98 = 221
999 + 1 = 1000
0 + 0 = 0

内容的提问来源于stack exchange,提问作者Quinton Wallenfang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:57