题解 | #高精度整数加法#
高精度整数加法
http://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6
如果使用现成的工具类来计算,可以用BigInteger类来实现,3行代码:
BigInteger a = new BigInteger(sc.nextLine()); BigInteger b = new BigInteger(sc.nextLine()); System.out.println(a.add(b));不过出题的本意是自己写代码实现:
逆序后相加,要考虑到每位相加结果的进位和最后一位的进位
package com.hw.newcoder;
/**
输入两个用字符串 str 表示的整数,求它们所表示的数之和。
9876543210 + 1234567890 = 11111111100
*/
import java.math.BigInteger;
import java.util.Scanner;
public class BigIntPlus {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
// BigInteger a = new BigInteger(sc.nextLine());
// BigInteger b = new BigInteger(sc.nextLine());
// System.out.println(a.add(b));
String aStr = sc.nextLine();
String bStr = sc.nextLine();
if (aStr.length() < bStr.length()) {
String tmp = aStr;
aStr = bStr;
bStr = tmp;
}
char[] aCharReverse = new StringBuffer(aStr).reverse().toString().toCharArray();
char[] bCharReverse = new StringBuffer(bStr).reverse().toString().toCharArray();
StringBuffer sb = new StringBuffer();
int carry = 0; //进位
if (aStr.length() == bStr.length()) {//长度相等的情况,容易计算
for (int i = 0; i < aStr.length(); i++) { //按位逆序相加,考虑进位carry
int echSum = (Integer.parseInt(aCharReverse[i] + "") + Integer.parseInt(bCharReverse[i] + "") + carry) % 10;
carry = (Integer.parseInt(aCharReverse[i] + "") + Integer.parseInt(bCharReverse[i] + "") + carry) / 10;
sb.append(echSum);
if ((i == aStr.length() - 1) && carry == 1) {//最后一位的进位处理
sb.append("1");
}
}
} else {
for (int i = 0; i < bStr.length(); i++) { //逆序相加,先计算相同位数的和以及进位
int echSum = (Integer.parseInt(aCharReverse[i] + "") + Integer.parseInt(bCharReverse[i] + "") + carry) % 10;
carry = (Integer.parseInt(aCharReverse[i] + "") + Integer.parseInt(bCharReverse[i] + "") + carry) / 10;
sb.append(echSum);
}
for (int j = bStr.length(); j < aStr.length(); j++) {//再计算较长数组多出来的部分和进位
int echSum = (Integer.parseInt(aCharReverse[j] + "") + carry) % 10;
carry = (Integer.parseInt(aCharReverse[j] + "") + carry) / 10;
sb.append(echSum);
if ((j == aStr.length() - 1) && carry == 1) {//最后一位的进位处理
sb.append("1");
}
}
}
System.out.println(sb.reverse().toString());//逆序后输出结果
}
}
}
