题目
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
1、num1 和num2 的长度都小于 5100.
2、num1 和num2 都只包含数字 0-9.
3、num1 和num2 都不包含任何前导零。
4、你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
示例
输入:“256”
“232”
输出:“488”
解法
我们直接模拟加法过程(按位相加,溢出补一)
(图片来源于网络)
代码
代码里面其实还是有些取巧的部分,提供两种写法,思路一样,但第二种简洁很多。
public class problem415 {
public String addStrings(String num1, String num2) {
String res="";
//分别表示num1、num2的指针,从尾部开始
int i=num1.length()-1;
int j=num2.length()-1;
int m=0;
int n=0;
int carry=0;//代表当前位相加是否产生进位
int tmp;
while(i>=0||j>=0){
if(i>=0) m=Integer.parseInt(num1.charAt(i)+"");
else m=0;
if(j>=0) n=Integer.parseInt(num2.charAt(j)+"");
else n=0;
tmp=n+m+carry;//求和
// System.out.println("tmp"+tmp);
res=tmp%10+res;
carry=tmp/10;
i--;
j--;
}
if(carry==1) res=1+res;
return res;
}
public static void main(String[] args) {
problem415 pro=new problem415();
System.out.println(pro.addStrings("858", "222"));
}
}
public class problem415_2 {
public String addStrings(String num1, String num2) {
StringBuilder res=new StringBuilder();
int carry=0;//临时和
int i=num1.length()-1;
int j=num2.length()-1;
while(i>=0||j>=0||carry!=0){
if(i>=0) carry+=num1.charAt(i--)-'0';
if(j>=0) carry+=num2.charAt(j--)-'0';
res.append(carry%10);
carry=carry/10;
}
return res.reverse().toString();
}
public static void main(String[] args) {
problem415_2 pro=new problem415_2();
System.out.println(pro.addStrings("858", "222"));
}
}