//容易忽视的点在于 加法进位时的条件时大于等于10 而不只是大于10
import java.util.ArrayList;
import java.util.LinkedList;
public class BigIntegerSum {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("123456");
list.add("123456789");
list.add("123456789123");
System.out.println(new BigIntegerSum().sum(list));
}
public String sum(ArrayList<String> numbers) {
// write code here
String str = "0";
for (String s : numbers) {
str = addOfString(str, s);
}
return str;
}
public String addOfString(String s1, String s2) {
//两个字符串相加
char[] array1 = s1.toCharArray();
char[] array2 = s2.toCharArray();
LinkedList<String> list = new LinkedList<>();//保存结果的数组
String str = "";
if (array1.length > array2.length) {
//将第二个数填充
int lengthCha = array1.length - array2.length; //获得填充0的位数
String lingStr = "";
for (int i = 0; i < lengthCha; i++) {
lingStr += "0";
}
s2 = lingStr + s2;//获得填充零后的s2
char[] array2WithZero = s2.toCharArray();
int jinwei = 0;
for (int i = array2WithZero.length - 1; i >= 0; i--) {
int a1 = charToInt(array1[i]); //获取数字
int a2 = charToInt(array2WithZero[i]); //获取数字
int ar = a1 + a2 + jinwei;
int re = ar % 10;
list.addFirst(re + "");//插到保存结果的链表的前部
if (ar >= 10) {
jinwei = ar / 10;
} else {
jinwei = 0;
}
}
if (charToInt(array1[0]) + charToInt(array2WithZero[0]) > 10) {
list.addFirst((charToInt(array1[0]) + charToInt(array2WithZero[0])) / 10 + "");
}
for (String s : list) {
str += s;
}
return str;
}
if (array1.length < array2.length) {
return addOfString(s2, s1);
}
if (array1.length == array2.length) {
int jinwei = 0;
for (int i = array2.length - 1; i >= 0; i--) {
int a1 = charToInt(array1[i]); //获取数字
int a2 = charToInt(array2[i]); //获取数字
int ar = a1 + a2 + jinwei;
int re = ar % 10;
list.addFirst(re + "");//插到保存结果的链表的前部
if (ar >= 10) {
jinwei = 1;
} else {
jinwei = 0;
}
}
if (charToInt(array1[0]) + charToInt(array2[0]) > 10) {
list.addFirst("1");
}
for (String s : list) {
str += s;
}
return str;
}
return str;
}
public static int charToInt(char c) {
String str1 = String.valueOf(c); //先将字符转成字符串
int a1 = Integer.parseInt(str1);//再将单个数字的字符串转成数字
return a1;
}
}
原文:https://www.cnblogs.com/chyEric/p/14286738.html