都知道数据类型 Integer、Long等存储有限当进行大数运算的时候会导致溢出,java提供了BigInteger、BigDecimal操作大数;

自己实现了一个简单的大整数相加的方法了,使用String来实现大整数的相加,根据加法的竖列公式进行计算 个位对个位 十位对十位…

例如数字:142798532297 和 1427985322

  1. 将当前字符串进行反转

  2. 从个位依次相加

  3. 判断相加结果是否存在进位

  4. 保存当前位置相加后的结果

  5. 将结果反转过来得到最终的和

1
2
3
4
7 9 2 2 3 5 8 9 7 2 4 1
2 2 3 5 8 9 7 2 4 1 
--------------------------
9 1 6 7 1 5 6 2 2 4 4 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static String getBigNumberSum(String numA, String numB) {
    if (numA.length() < 1 && numB.length() < 1) {
        throw new NumberFormatException("Zero length BigInteger");
    }
    String numberReg = "[0-9]+";
    if (numA.length() > 0 && !numA.matches(numberReg)) {
        throw new NumberFormatException("For input string: " + "\"" + numA + "\"");
    }
    if (numB.length() > 0 && !numB.matches(numberReg)) {
        throw new NumberFormatException("For input string: " + "\"" + numB + "\"");
    }
    StringBuilder reverseBuilderNumA = new StringBuilder(numA).reverse();
    StringBuilder reverseBuilderNumB = new StringBuilder(numB).reverse();
    final int lenA = reverseBuilderNumA.length();
    final int lenB = reverseBuilderNumB.length();
    final int maxLen = lenA > lenB ? lenA : lenB;
    int carry = 1;
    boolean isCarry = Boolean.FALSE;
    StringBuilder resultBuild = new StringBuilder();
    for (int i = 0; i < maxLen; i++) {
        int valA = i < lenA ? reverseBuilderNumA.charAt(i) - '0' : 0;
        int valB = i < lenB ? reverseBuilderNumB.charAt(i) - '0' : 0;
        int resultVal = valA + valB;
        if (isCarry) {
            resultVal += carry;
        }
        isCarry = resultVal > 9;
        if (i == maxLen - 1 && isCarry) {
            resultBuild.append(resultVal % 10).append(carry);
        } else {
            resultBuild.append(isCarry ? resultVal % 10 : resultVal);
        }
    }
    return resultBuild.reverse().toString();
}

我是通过StringBuilder的reverse方法对字符串进行了一个反转

1
2
StringBuilder reverseBuilderNumA = new StringBuilder(numA).reverse(); 
StringBuilder reverseBuilderNumB = new StringBuilder(numB).reverse();

然后以最大的数为基础进行循环相加,如果当前这个较小的数下标越界则补充零

1
2
 int valA = i < lenA ? reverseBuilderNumA.charAt(i) - '0' : 0;    
 int valB = i < lenB ? reverseBuilderNumB.charAt(i) - '0' : 0;

reverseBuilderNumA.charAt(i) - ‘0’ 将当前char类型转换为 int 类型

判断是否需要进位,两个1位的数字相加最大范围在0 - 18 当大于 9 时进一位

1
 isCarry = resultVal > 9;

如果当前相加需要进位则保存个位否则保存当前相加后的结果

1
resultBuild.append(isCarry ? resultVal % 10 : resultVal);

项目地址:https://github.com/pengliangs/data-structure-algorithms