题目的主要信息:
- 输入两个字符串表示的整数,对其进行相加运算
- 字符串中只有字符0-9,即正整数加法运算
- 字符串长度:
方法一:遍历相加
具体做法:
从两个字符串末尾开始往前遍历每个字符,直到遍历到两个字符串的下标都为0. 将遍历到的字符串转化为数字,如果其中一个字符串已经过了首部,则直接数字记为0.
然后将两个数字与进位变量相加,取余数放入现在这位,整除10作为进位,初始进位变量为0。最后结束之后如果进位变量还有1,则添加在后面。
最后将其逆序并转成字符串输出即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
String s1 = scan.next();
String s2 = scan.next(); //输入两个数
String res = add(s1, s2); //输出
System.out.println(res);
}
}
private static String add(String s1, String s2) { //两个字符串整数相加
StringBuilder res = new StringBuilder();
int n = s1.length() - 1;
int m = s2.length() - 1;
int carry = 0; //进位
while (n >= 0 || m >= 0) { //从两个人字符串最后一位开始相加
char c1 = n >= 0 ? s1.charAt(n--) : '0'; //没有了就用0代替
char c2 = m >= 0 ? s2.charAt(m--) : '0';
int sum = (c1 - '0') + (c2 - '0') + carry; //两个数子与进位相加
res.append(sum % 10); //余数添加进结果
carry = sum / 10; //进位
}
if (carry == 1) { //最后的进位
res.append(carry);
}
return res.reverse().toString(); //反转后转成字符串
}
}
复杂度分析:
- 时间复杂度:,其中为较长字符串的长度,遍历最多是较长的字符串长度
- 空间复杂度:,保留运算结果的StringBuilder的长度最多为
方法二:大整数运算
具体做法:
直接利用Java的大整数类,将字符串转变成大整数类型,然后将后者加到前者。
import java.util.Scanner;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
String s1 = scan.next();
String s2 = scan.next(); //输入两个数
BigInteger a = new BigInteger(s1); //将字符串转成大整数
BigInteger b = new BigInteger(s2);
System.out.println(a.add(b)); //大整数相加
}
}
}
复杂度分析:
- 时间复杂度:,大整数相加复杂度也是较长字符串的长度
- 空间复杂度:,大整数记录的空间最多是较长字符串的长度