都知道数据类型 Integer、Long等存储有限当进行大数运算的时候会导致溢出,java提供了BigInteger、BigDecimal操作大数;
自己实现了一个简单的大整数相加的方法了,使用String来实现大整数的相加,根据加法的竖列公式进行计算 个位对个位 十位对十位…
例如数字:142798532297 和 1427985322
-
将当前字符串进行反转
-
从个位依次相加
-
判断相加结果是否存在进位
-
保存当前位置相加后的结果
-
将结果反转过来得到最终的和
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