有若干大整数,需要对其进行求和操作。
输入格式
每行输入一个字符串代表一个大整数,连续输入若干行,当某行字符为e或E时退出。
输入样例:
42846280183517070527831839425882145521227251250327
55121603546981200581762165212827652751691296897789
e
输出样例:
97967883730498271109594004638709798272918548148116
代码展示
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
if (str.equals("e") || str.equals("E")) {
//System.out.println("我在if里");
break;
} else {
//System.out.println("我在else里");
list.add(str);
}
}
//System.out.println("接收完成");
ArrayList<String> temp = new ArrayList<>();
temp.add(sumTwo(list.get(0), list.get(1)));
for (int i = 2, j = 0; i < list.size(); i++, j++) {
//System.out.println("我其实不该进循环");
temp.add(sumTwo(list.get(i), temp.get(j)));
}
String res = temp.get(temp.size() - 1);
System.out.println(res);
//检查错误
/*
String ptaAns = "97967883730498271109594004638709798272918548148116";
System.out.println(ptaAns);
if (ptaAns.length() != res.length()) {
System.out.println("长度不一样啊");
System.out.println("pta len = " + ptaAns.length());
System.out.println("my len = " + res.length());
}
for (int i = 0; i < ptaAns.length(); i++) {
if (ptaAns.charAt(i) != res.charAt(i)) {
System.out.print("#");
} else {
System.out.print(ptaAns.charAt(i));
}
}
*/
}
public static String sumTwo(String s1, String s2) {
StringBuilder result = new StringBuilder();
/*StringBuilder zero = new StringBuilder();
for (int i = 0; i < 30; i++) {
zero.append(0);
}
String zeroStr = zero.toString();*/
String zeroStr = "00000000000000000000000000000000000000000000";
int len1 = s1.length();
int len2 = s2.length();
//较小数前段补0对齐
if (len1 > len2) {
s2 = zeroStr.substring(0, len1 - len2) + s2;
} else {
s1 = zeroStr.substring(0, len2 - len1) + s1;
}
//两数相加,从低位逐个运算进位
int carry = 0;
for (int i = s1.length() - 1; i >= 0; i--) {
//System.out.println("当前i为: " + (s1.length()-i));
int temp = (s1.charAt(i) - '0') + (s2.charAt(i) - '0');
//System.out.println("temp = " + (s1.charAt(i) - '0') + " + "+ (s2.charAt(i) - '0') + " = " + temp);
result.append((temp + carry) % 10);
//System.out.println("result now is " + result.toString());
carry = (temp + carry) / 10;
//System.out.println("carry: " + carry);
//System.out.println();
}
if (carry > 0) result.append(carry);//不过此时结果是逆序
//倒转一下
String resStr = result.toString();
StringBuilder ans = new StringBuilder();
for (int i = resStr.length() - 1; i >= 0; i--) {
ans.append(resStr.charAt(i));
}
return ans.toString();
}
}