private static String add(String str1, String str2) {
//任何一个字符串为null或空字符串,都不需要相加了
if (str1 == null || str1.isEmpty()) {
return str2;
}
if (str2 == null || str2.isEmpty()) {
return str1;
}
int maxLength = Math.max(str1.length(), str2.length());
//定义一个存贮结果的字符串,长度要比最大长度字符串还长一位,用于存储可能出现的进位
StringBuilder result = new StringBuilder(maxLength + 1);
//翻转两个字符串
str1 = new StringBuffer(str1).reverse().toString();
str2 = new StringBuffer(str2).reverse().toString();
//反转后的结果分别为:
//954321
//321
int minLength = Math.min(str1.length(), str2.length());
//进位
int carry = 0;
//当前位上的数值
int currentNum = 0;
//循环变量
int i = 0;
while (i < minLength) {
//分别获取两个字符对应的字面数值,然后相加,再加上进位
currentNum = str1.charAt(i) + str2.charAt(i) - 2 * '0' + carry;
//获取进位
carry = currentNum / 10;
//处理当前位的最终值
currentNum %= 10;
//保存当前位的值到最终的字符缓冲区中
result.append(currentNum);
i++;
}
String longStr = str1.length() > str2.length() ? str1 : str2;
// 处理进位从上次i开始
while (i < longStr.length()) {
//分别获取两个字符对应的字面数值,然后相加,再加上进位
currentNum = str1.charAt(i) - '0' + carry;
//获取进位
carry = currentNum / 10;
//处理当前位的最终值
currentNum %= 10;
//保存当前位的值到最终的字符缓冲区中
result.append(currentNum);
i++;
}
//处理最后一个的进位(当循环结束后,是不是还可能会有一个进位)
if (carry > 0) {
result.append(carry);
}
//最后翻转恢复字符串,再返回
return result.reverse().toString();
}
版权归属:
秋之牧云
许可协议:
转载请注明出处
评论区