欢迎访问宙启技术站
智能推送

Java函数实现大数相加的方法

发布时间:2023-06-13 06:33:58

Java中基本数据类型int和long能够存储的最大值为2^31-1和2^63-1,而在实际编程中需要处理的数字往往超过了这些范围,因此需要使用大数相加的方法解决这个问题。大数相加指的是对超过基本数据类型范围的数字进行加法运算的方法。例如,对于两个十进制数9999999999999999和8888888888888888进行相加,以基本数据类型int或long来存储这两个数是无法实现的,因此需要另外的方法来进行计算。本文将介绍三种实现大数相加的方法。

方法一:使用字符串进行计算

种方法是将两个大数用字符串类型存储,然后从字符串的末尾开始逐位相加,并将进位保留,最后得到的结果也是一个字符串。这种方法相对简单,但是比较慢。

Java代码实现:

public static String addString(String num1, String num2) {
    StringBuilder sb = new StringBuilder();
    int carry = 0, i = num1.length() - 1, j = num2.length() - 1;
    while (i >= 0 || j >= 0 || carry > 0) {
        int x = (i >= 0 ? num1.charAt(i) - '0' : 0);
        int y = (j >= 0 ? num2.charAt(j) - '0' : 0);
        int sum = x + y + carry;
        sb.append(sum % 10);
        carry = sum / 10;
        i--; j--;
    }
    return sb.reverse().toString();
}

方法二:使用数组进行计算

第二种方法是将两个大数用数组类型存储,然后从数组的末尾开始逐位相加,并将进位保留,最后得到的结果也是一个数组。相对于使用字符串,使用数组计算可以提高效率。

Java代码实现:

public static int[] addArray(int[] nums1, int[] nums2) {
    int m = nums1.length, n = nums2.length, carry = 0, k = 0;
    int[] res = new int[Math.max(m, n) + 1];
    for (int i = m - 1, j = n - 1; i >= 0 || j >= 0 || carry > 0; i--, j--) {
        int x = (i >= 0 ? nums1[i] : 0);
        int y = (j >= 0 ? nums2[j] : 0);
        int sum = x + y + carry;
        res[k++] = sum % 10;
        carry = sum / 10;
    }
    // 将结果中的前导零去除
    int i = k - 1;
    while (i >= 0 && res[i] == 0) i--;
    if (i == -1) return new int[]{0};
    int[] ans = new int[i + 1];
    for (int j = i, l = 0; j >= 0; j--, l++) {
        ans[l] = res[j];
    }
    return ans;
}

方法三:使用链表进行计算

第三种方法是将两个大数用链表类型存储,然后从链表的末尾开始逐位相加,并将进位保留,最后得到的结果也是一个链表。相对于使用数组,使用链表计算可以提高效率。

Java代码实现:

public static ListNode addList(ListNode l1, ListNode l2) {
    ListNode dummy = new ListNode(-1), curr = dummy;
    int carry = 0;
    while (l1 != null || l2 != null || carry > 0) {
        int x = (l1 != null ? l1.val : 0);
        int y = (l2 != null ? l2.val : 0);
        int sum = x + y + carry;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        carry = sum / 10;
        if (l1 != null) l1 = l1.next;
        if (l2 != null) l2 = l2.next;
    }
    return dummy.next;
}

总结

本文介绍了三种实现大数相加的方法,分别使用了字符串、数组和链表进行计算。在实际编程中,如果需要处理大数相加的问题,可以根据具体情况选择不同的实现方法。如果数字比较大,建议使用数组或链表进行计算,这样可以提高效率,减少时间复杂度。