给定一组自然数,数字的值有可能会大于2^64 ,要求计算出所有数字的和 package top.handsomecoder;
import java.math.BigDecimal;
import java.util.ArrayList;
public class Solution {
    /**
     * 计算一组数字的和
     * @param numbers string字符串ArrayList 一组自然数
     * @return string字符串
     */
    public String sum (ArrayList<String> numbers) {
        BigDecimal initN = new BigDecimal("0");
        for (String str :
                numbers) {
            BigDecimal bd1 = new BigDecimal(str);
            initN=initN.add(bd1);
        }
        return initN.toString();
    }
}
 import org.junit.Test;
import java.util.ArrayList;
public class Solution {
    /**
     * 计算一组数字的和
     * @param numbers string字符串ArrayList 一组自然数
     * @return string字符串
     */
    public String sum (ArrayList<String> numbers) {
        // write code here
        String result="0";
        for (String number : numbers) {
            if(number==null||number.length()==0){
                continue;
            }
            int resultLen = result.length();
            int curNumLen = number.length();
            int sum=0;
            int remain;
            StringBuilder stringBuilder = new StringBuilder();
            while (resultLen>0||curNumLen>0){
                int resultNum=0;
                if(resultLen>0){
                    resultNum = result.charAt(--resultLen) - '0';
                }
                int curNum=0;
                if(curNumLen>0){
                    curNum = number.charAt(--curNumLen) - '0';
                }
                sum=sum+resultNum+curNum;
                remain=sum%10;
                stringBuilder.append(remain);
                sum/=10;
            }
            if(sum!=0){
                stringBuilder.append(sum);
            }
            result=stringBuilder.reverse().toString();
        }
        return result;
    }
    @Test
    public void test(){
        String num1="123456";
        String num2="123456789";
        String num3="123456789123";
        ArrayList<String> strings = new ArrayList<>();
        strings.add(num1);
        strings.add(num2);
        strings.add(num3);
        System.out.println(sum(strings));
    }
}
 public class Solution {
  /**
   * 计算一组数字的和
   * @param numbers string字符串ArrayList 一组自然数
   * @return string字符串
   */
  public String sum (ArrayList<String> numbers) {
    String cur = numbers.get(0);
    for(int i = 1; i < numbers.size(); i++) {
      cur = add(cur, numbers.get(i));
    }
    return cur;
  }
  private String add(String num1, String num2) {
    StringBuilder ansBuilder = new StringBuilder();
    int ptr1 = num1.length() - 1, ptr2 = num2.length() - 1;
    boolean carry = false;
    while (ptr1 >= 0 && ptr2 >= 0) {
      int sum = num1.charAt(ptr1--) - '0' + num2.charAt(ptr2--) - '0';
      if (carry) {
        sum++;
        carry = false;
      }
      if (sum >= 10) {
        sum -= 10;
        carry = true;
      }
      ansBuilder.append(sum);
    }
    while (ptr1 >= 0) {
      int num = num1.charAt(ptr1--) - '0';
      if (carry) {
        num++;
        carry = false;
      }
      if (num >= 10) {
        num -= 10;
        carry = true;
      }
      ansBuilder.append(num);
    }
    while (ptr2 >= 0) {
      int num = num2.charAt(ptr2--) - '0';
      if (carry) {
        num++;
        carry = false;
      }
      if (num >= 10) {
        num -= 10;
        carry = true;
      }
      ansBuilder.append(num);
    }
    if (carry) {
      ansBuilder.append(1);
    }
    return ansBuilder.reverse().toString();
  }
}
                                                                                        public static String sum(List<String> numList) {
        numList = numList.stream()
                .filter(num -> StringUtils.isNotBlank(num))
                .map(num -> num.replaceAll(" ", ""))
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(numList)) {
            return "0";
        }
        StringBuffer sum = new StringBuffer(numList.get(0));
        for (int i = 1; i < numList.size(); i++) {
            StringBuffer next = new StringBuffer(numList.get(i));
            Integer sumLength = sum.length();
            Integer nextLength = next.length();
            Stack<Character> stack = new Stack<>();
            boolean hasCarry = false;
            while (sumLength > 0 || nextLength > 0 || hasCarry) {
                Integer sumNum = 0;
                Integer nextNum = 0;
                if (sumLength > 0) {
                    String sumLast = sum.substring(sumLength - 1, sumLength);
                    sumNum = Integer.parseInt(sumLast);
                }
                if (nextLength > 0) {
                    String nextLast = next.substring(nextLength - 1, nextLength);
                    nextNum = Integer.parseInt(nextLast);
                }
                Integer thisTurnInt = sumNum + nextNum + (hasCarry ? 1 : 0);
                Character thisTurn = 
                        new Character(thisTurnInt.toString().charAt(thisTurnInt.toString().length() - 1));
                stack.push(new Character(thisTurn));
                if (thisTurnInt > 9) {
                    hasCarry = true;
                } else {
                    hasCarry = false;
                }
                sumLength--;
                nextLength--;
            }
            sum = new StringBuffer();
            while (stack.size() > 0) {
                sum.append(stack.pop());
            }
        }
        return sum.toString();
    }