初学智一面笔试题Gtalent如何实现java中的大数的优雅相加?
比如:123123213123123123213123+9934934934929324993429324
在线编译和运行测试地址:http://www.gtalent.cn/exam/interview?token=b1513dfce5ac745f4df43e45885780e6
用java代码如何实现呢?
直接上数字long相加结果会怎样呢?
比如菜鸡的第一想法是这样的:
public class test {
public static void main(String[] args) {
//您的代码
Long num1=123123213123123123213123L
Long num2=9934934934929324993429324L
System.out.println(num1+num2);
}
}
然后报错来了
/code/test.java:5: 错误: 过大的整数: 123123213123123123213123
Long num1=123123213123123123213123L
^
/code/test.java:5: 错误: 需要';'
Long num1=123123213123123123213123L
^
/code/test.java:6: 错误: 过大的整数: 9934934934929324993429324
Long num2=9934934934929324993429324L
^
/code/test.java:6: 错误: 需要';'
Long num2=9934934934929324993429324L
^
4 个错误
那么正确的姿势是这样的
public class test {
public static void main(String[] args) {
//您的代码
String num1="123123213123123123213123";
String num2="9934934934929324993429324";
System.out.println(jia(num1,num2));
}
static String jia(String a, String b) {
int resultLength = Math.max(a.length(), b.length());
// 把两个转成数组,逆序存储
int[] ArrA = new int[resultLength + 1];
for (int i = 0; i < a.length(); i++) {
ArrA[i] = a.charAt(a.length() - 1 - i) - '0';
}
int[] ArrB = new int[resultLength + 1];
for (int i = 0; i < b.length(); i++) {
ArrB[i] = b.charAt(b.length() - 1 - i) - '0';
}
// 构建结果数组
int[] result = new int[resultLength + 1];
// 遍历两个数组,同位相加
for (int i = 0; i < result.length; i++) {
int temp = result[i];
temp += ArrA[i];
temp += ArrB[i];
//判断是否进位
if (temp >= 10) {
temp = temp - 10;
result[i + 1] = 1;
}
result[i] = temp;
}
// result 逆序,转成 string
StringBuilder sb = new StringBuilder();
// 是否找到大整数的最高有效位
boolean findFirst = false;
for (int i = result.length - 1; i > 0; i--) {
if (!findFirst) {
if (result[i] == 0) {
continue;
}
findFirst = true;
}
sb.append(result[i]);
}
return sb.toString();
}
}