算法:如何实现两个大数相加

Posted 小羊子说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:如何实现两个大数相加相关的知识,希望对你有一定的参考价值。

文章目录

问题

实现两个很大很大的数相加,求出它们的和。

要求

1、是整数;
2、两个数无限大,long 都装不下;
3、不能用 BigInteger;
4、不能用任何包装类提供的运算方法;
5、两个数都是以字符串的方式提供。

以下算法根据《漫画算法》小灰的算法之旅一书,并结合自己的心得,优化整理。

思路

  1. 用数组来处理很大的数
  2. 用“竖式”遍历相加,结果用数组来存储。
  3. 最后将数组倒序为 String 即可实现。

代码实现

package practise;
/**
 * <pre>
 *     author : June Yang
 *     time   : 2022/07/25
 *     desc   : 两个大数相加
 *     version: 1.0
 * </pre>
 */
public class BigNumAdd 
    public static void main(String[] args) 
        System.out.println(bigNumberNum("6868", "128080989089093"));
    
    public static String bigNumberNum(String bigNumberA, String bigNumBerB) 
        int maxLength = Math.max(bigNumberA.length(), bigNumBerB.length());
        int[] arrayA = new int[maxLength + 1];
        // 将 String 转化成 int
        for (int i = 0; i < bigNumberA.length(); i++) 
            arrayA[i] = bigNumberA.charAt(bigNumberA.length() - 1 - i) - '0';
        
        int[] arrayB = new int[maxLength + 1];
        // 将 String 转化成 int
        for (int i = 0; i < bigNumBerB.length(); i++) 
            arrayB[i] = bigNumBerB.charAt(bigNumBerB.length() - 1 - i) - '0';
        
        // 得到结果的数组
        int[] result = new int[maxLength + 1];

        // 核心算法:竖式相加 满 10 进 1
        for (int i = 0; i < result.length; i++) 
            int temp = result[i];
            temp += arrayA[i];
            temp += arrayB[i];

            if (temp >= 10) 
                temp = temp - 10;
                result[i + 1] = 1; // 将进位后的 1 存到数组的下一位
            
            result[i] = temp;
        
        // 将 result 数组倒序之后再转成 String
        StringBuilder sb = new StringBuilder();
        boolean findFist = false;
        for (int i = result.length - 1; i >= 0; i--) 
            if (!findFist) 
                if (result[i] == 0) 
                   continue;  // continue 的作用:跳过当前循环继续下一个循环。此处 用于跳过结果数组末尾的 "0"
                
                findFist = true;
            
            sb.append(result[i]);
        
        return sb.toString();
    


小结:

时间复杂度为 o(n)。算法可以进一步优化。
网上有很多关于大数相加的解法,这个解法个人认为比较好理解,好上手。
在理解以上几个关键的点之后,很容易写出来。

扩展阅读:

  1. 进一步了解 java 中的工具类 BigInterger 和 BigDecimal。
  2. 其他相关算法:
    LeetCode 字符串相乘
    LeetCode 字符相加

以上是关于算法:如何实现两个大数相加的主要内容,如果未能解决你的问题,请参考以下文章

算法:如何实现两个大数相加

iOS中计算两个大数相加算法(OC实现)

JavaScript中大数相加的解法

HDU 1047 Integer Inquiry 大数相加 string解法

大数相加算法实现

大数相加算法实现