题目:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:
可以通过手工来模拟加法的过程,参考https://leetcode-cn.com/problems/add-strings/solution/add-strings-shuang-zhi-zhen-fa-by-jyd/
用i,j二个指针指向所给字符串的末尾指向的数,然后向前遍历,并且将进位carray赋初始值0,进行的过程如下:
- 取二个字符串尾部的数,转成int型,(通过num.charAt(i)-'0'来实现),取的时候回出现二个字符串的长度不一样,也就是可能一个字符串能取到数,另一个取不到数,这时用0来填充,即int n1=i>=0 ?num1.charAt(i)-'0':0;
int n2=j>=0 ?num2.charAt(j)-'0' :0; - 相加得到结果,res(指的二个字符串尾部的数n1,n2,再加上进位carray)
- 更新进位carry
- 将真正进位数用StringBuilder接收,(sb.append(res%10))
- 更新i,j的值,使它们都从后往前运动,
- 将最后的进位carray,添加到字符串缓冲区
- 反转就是所要的结果。
public String addStrings(String num1, String num2) {
if(num1==null||num2==null){
return num1==null ?num2:num1;
}
StringBuilder sb=new StringBuilder("");
int carray=0;
int i=num1.length()-1,j=num2.length()-1;
while(i>=0||j>=0){
int n1=i>=0 ?num1.charAt(i)-'0':0;
int n2=j>=0 ?num2.charAt(j)-'0' :0;
int temp=n1+n2+carray;
//计算进位
carray=temp/10;
//将进位后的数添加到缓冲区中
sb.append(temp%10);
i--;
j--;
}
if(carray==1){
sb.append(1);
}
return sb.reverse().toString();
}
}
大数相乘:
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0")){
return "0";
}
String res="0";
//将num2的每一个数与num1相乘
for(int i=num2.length()-1;i>=0;i--){
//进位
int carray=0;
//保存num2与num1相乘的结果
StringBuilder temp=new StringBuilder();
//补0
for(int j=0;j<num2.length()-1-i;j++){
temp.append(0);
}
int n2=i<0 ?0 :num2.charAt(i)-'0';
//num2与num1的每一位相乘
for(int j=num1.length()-1;j>=0||carray!=0;j--){
int n1=j<0 ?0:num1.charAt(j)-'0';
int product=(n1*n2+carray)%10;
temp.append(product);
//更新进位
carray=(n1*n2+carray)/10;
}
res=addString(res,temp.reverse().toString());
}
return res;
}
public String addString (String num1,String num2){
StringBuilder temp=new StringBuilder();
int carray=0;
for(int i=num1.length()-1,j=num2.length()-1;i>=0||j>=0||carray!=0;i--,j--){
int n1=i<0? 0:num1.charAt(i)-'0' ;
int n2=j<0? 0:num2.charAt(j)-'0';
//
int sum=(n1+n2+carray)%10;
temp.append(sum);
carray=(n1+n2+carray)/10;
}
return temp.reverse().toString();
}