题目
求两个超大整数的和,不能使用Java内置类BigInteger。
解题思路
1.同号相加,结果符号位取任意一个数的符号;
2.异号相加,取较大的数减去较小的数,结果符号取较大的数的符号位。
由于是超大数,因此我们使用String来存储。
源代码
public class BigNumberSum {
public static String bigNumberSum(String num1, String num2) {
char sign = '+';
char sign1 = num1.charAt(0);
char sign2 = num2.charAt(0);
String number1 = "";
String number2 = "";
//第一个数去符号位操作
if (sign1 == '-' || sign1 == '+') {
number1 = num1.substring(1);
} else {
sign1 = '+';
number1 = num1;
}
//第二个数去符号位操作
if (sign2 == '-' || sign2 == '+') {
number2 = num2.substring(1);
} else {
sign2 = '+';
number2 = num2;
}
//判断输入的字符是否是数字
boolean isDig1 = number1.matches("[1-9][0-9]*");
boolean isDig2 = number2.matches("[1-9][0-9]*");
if (!isDig1 || !isDig2)
throw new NumberFormatException("输入的数据不是正确格式的整数");
//获取两个数的长度
int length1 = number1.length();
int length2 = number2.length();
int len = length1 >= length2 ? length1 + 1 : length2 + 1;
StringBuffer numBuffer1 = new StringBuffer();
StringBuffer numBuffer2 = new StringBuffer();
//扩展数据的长度,使她们的长度一样
if (length1 > length2) {
for (int i = 0; i < length1 - length2; i++)
numBuffer2.append("0");
}
if (length1 < length2) {
for (int i = 0; i < length2 - length1; i++)
numBuffer1.append("0");
}
numBuffer1.append(number1);
numBuffer2.append(number2);
char[] chars1 = numBuffer1.reverse().toString().toCharArray();
char[] chars2 = numBuffer2.reverse().toString().toCharArray();
//存储每位相加的结果,不考虑进位
int[] result = new int[len];
if (sign1 == sign2) {//同号相加
sign = sign1;//结果的符号
for (int i = 0; i < len - 1; i++)
result[i] = (chars1[i] - '0') + (chars2[i] - '0');
//进位处理
for (int i = 0; i < len; i++) {
if (result[i] >= 10) {
result[i + 1] += result[i] / 10;
result[i] = result[i] % 10;
}
}
} else {
//拿大的数减去小的数
boolean lager = number1.compareTo(number2) > 0 ? true : false;
if (lager) {
sign = sign1;
for (int i = 0; i < len - 1; i++)
result[i] = (chars1[i] - '0') - (chars2[i] - '0');
} else {
sign = sign2;
for (int i = 0; i < len - 1; i++)
result[i] = (chars2[i] - '0') - (chars1[i] - '0');
}
//处理错位
for (int i = 0; i < len; i++) {
if (result[i] < 0) {
result[i] += 10;
result[i + 1]--;
}
}
}
// 结果没有进位时的0处理
boolean flag = true;
StringBuffer resultStr = new StringBuffer();
for (int i = result.length - 1; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
}
flag = false;
resultStr.append(result[i]);
}
// 符号处理
if (sign == '-') {
return "-" + resultStr.toString();
} else {
return resultStr.toString();
}
}
public static void main(String[] args) {
System.out.println(bigNumberSum("11111111111111111111111111111111","111111111111111111111111111111111"));
}
}