题目:两个大数相加,都是正整数。
例如:
"1" + "2" = "3"
"11111111111111111111111111111111111111111111111111" + "11111111111111111111111111111111111111111111111111" = "22222222222222222222222222222222222222222222222222"
题型分类
- 高精度运算
知识点
解题思路
- 从低位往高位相加
- 每次相加前,正确处理前一次运算是否有进位
复杂度分析:
时间复杂度 O(n)
空间复杂度 O(n) 使用了数组、StringBuilder
public String addBigNum(String val1, String val2) {
if (val1 == null || "".equals(val1)) {
return val2;
}
if (val2 == null || "".equals(val2)) {
return val1;
}
int length1 = val1.length();
int length2 = val2.length();
int maxLength = length2;
int minLength = length1;
char[] maxArr = val2.toCharArray();
char[] minArr = val1.toCharArray();
if (length1 > length2) {
maxLength = length1;
minLength = length2;
maxArr = val1.toCharArray();
minArr = val2.toCharArray();
}
int[] nums = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
char zero = '0';
boolean isCarry = false; // true 发生进位
int[] resultArr = new int[maxLength + 1]; // +1因为可能进一位
int resultIndex = resultArr.length - 1;
int j = minLength - 1;
for (int i = maxLength - 1; i > -1; i--) {
int moreValue = maxArr[i];
int lessValue = j > -1 ? minArr[j--] : 0;
// 避免使用Integer因自动拆装带来的性能损失
int addVaue = nums[moreValue - zero] + nums[lessValue - zero];
if (isCarry) {
addVaue++;
}
if (addVaue > 9) {
isCarry = true;
} else {
isCarry = false;
}
resultArr[resultIndex--] = addVaue % 10;
}
if (isCarry) {
resultArr[0] = 1;
}
StringBuilder resStr = new StringBuilder();
for (int i = isCarry ? 0 : 1; i < resultArr.length; i++) {
resStr.append(resultArr[i]);
}
return resStr.toString();
}
// 测试
System.out.println("2".equals(addBigNum("1", "1")) ? "OK" : "ERROR");
System.out.println("246".equals(addBigNum("123", "123")) ? "OK" : "ERROR");
System.out.println("240".equals(addBigNum("120", "120")) ? "OK" : "ERROR");
System.out.println("500".equals(addBigNum("250", "250")) ? "OK" : "ERROR");
System.out.println("4294967294".equals(addBigNum(Integer.MAX_VALUE + "", Integer.MAX_VALUE + "")) ? "OK" : "ERROR");
System.out.println("18446744073709551614".equals(addBigNum(Long.MAX_VALUE + "", Long.MAX_VALUE + "")) ? "OK" : "ERROR");
System.out.println("22222222222222222222222222222222222222222222222222"
.equals(addBigNum("11111111111111111111111111111111111111111111111111",
"11111111111111111111111111111111111111111111111111")) ? "OK" : "ERROR");
System.out.println("22222222222222222222222222222222222222222222222238"
.equals(addBigNum("11111111111111111111111111111111111111111111111119",
"11111111111111111111111111111111111111111111111119")) ? "OK" : "ERROR");
System.out.println("30222222222222222222222222222222222222222222222238"
.equals(addBigNum("15111111111111111111111111111111111111111111111119",
"15111111111111111111111111111111111111111111111119")) ? "OK" : "ERROR");
补充说明
- 直接使用 JDK 中的 BigInteger 的 add()方法,但知识有限,看不懂。
- 入参、返回结果的最大位数是Integer.MAX_VALUE,因为String的最大长度是Integer.MAX_VALUE;Java中数组的最大长度也是Integer.MAX_VALUE。