题目描述
描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:s.length,t.length \le 100000s.length,t.length≤100000,字符串仅由’0’~‘9’构成
要求:时间复杂度 O(n)O(n)
思路:
借助整型数组和模拟数学加法计算:
package test;
public class BigAdd1 {
public static void main(String[] args) {
BigAdd1 bigAdd1 = new BigAdd1();
String solve = bigAdd1.solve("459309139", "733064366");
System.out.println(solve);
}
//大数加法,借助数组完成,使用数学模拟法
public static String solve (String s, String t) {
int longLen = s.length() > t.length() ? s.length() : t.length();
int shortLen = s.length() <= t.length() ? s.length() : t.length();
int[] res = new int[longLen +1];// 用于存最终数据的
//反转2个字符串
StringBuffer reverse_s = new StringBuffer(s).reverse();
StringBuffer reverse_t = new StringBuffer(t).reverse();
//求两个字符串中一个长的,一个短的,备用
StringBuffer shortStr =
reverse_s.length()< reverse_t.length() ? reverse_s : reverse_t;
StringBuffer longStr =
reverse_s.length()>=reverse_t.length() ? reverse_s : reverse_t;
//将短的字符串补位0 和长字符串一样长度,方便相加
for (int i = shortLen; i < longLen; i++) {
shortStr.append("0");
}
int up=0;//开始的进位,up代表进位
for (int i = 0; i < longLen; i++) {
//将每位相加的数存在数字res中
res[i]=(shortStr.charAt(i)-'0')+(longStr.charAt(i)-'0') + up;
up = res[i]/10;
res[i] = res[i]%10;
}
//最后的进位
if(up!=0){
res[longLen] = up;
}
//将数组转成字符串
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < res.length; i++) {
buffer.append(res[i]);
}
String s1 = buffer.reverse().toString();
//去掉字符串前面的0
if(s1.charAt(0)=='0'){
return s1.substring(1);
}else{
return s1;
}
}
}