题目
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
例如:"235" + "645" 结果为:"880","36" + "47" 结果为:"83"
解题
按照笔算加法的方式,相同数位对齐,依次进行加法,产生进位向前一位进位。如图:
从字符串的最高的下标对齐(字符串"abc",'a'的下标为0,'c'的下标是2,也就是两个字符串右对齐),依次向前遍历两个字符串到下标0的位置,如果其中一个字符串提前到下标0,那么之后遍历数位上都是0(相当于位数少的字符串高位用0补齐)。
代码
public String addStrings(String num1, String num2) {
if(null == num1){
return null;
}
if(null == num2){
return null;
}
int i = 0;
int carry = 0;
//StringBuilder模拟栈结构把地位的结果放入栈底部,高位结果放入栈顶部
StringBuilder sb = new StringBuilder();
while(i < num1.length() || i < num2.length()){
//从高下标开始,向0移动
int m = i < num1.length() ? (num1.charAt(num1.length() - 1 - i) - '0') : 0;
int n = i < num2.length() ? (num2.charAt(num2.length() - 1- i) - '0') : 0;
//产生的进位值,初始化0
int sum = m + n + carry;
//保存结果,更新进位值
sb.append(String.valueOf(sum % 10));
carry = sum / 10;
i++;
}
//最高位的进位单独处理
if(carry > 0){
sb.append(String.valueOf(carry));
}
//翻转StringBuilder获取结果
return sb.reverse().toString();
}