题目描述:
例如:
String a = “12546546…”;
String b = “4845452…”,
a的长度和b的长度都很大,且给出的数都是正整数
思路分析:
1、在进行相加的时候需要将末尾对齐,然后依次相加。
2、此时会涉及到一个问题,进位。两个数相加最多只会进一位,因为两个个位数相加最大只会是18。
3、两个数相加结果的位数只会有两种情况,要么是较大数位数的长度,要么就是较大数位数的长度加一。
4、在相加的时候可以把两个String代表的数转成数组然后再进行一个计算。
代码体现:
//大数相加
public class Solution {
public static void main(String[] args) {
String a = "148254154848";
String b = "7654554582";
//首先我们需要明确一点,最终结果的位数应该是两个数里面比较长的那个数的位数,或者是较长数的位数+1
//此时我们需要先判断出哪个数比较大,因为给的是两个正数,所以长度长的那个数相对来说就是大一点的,长度要是一样的话,就不用考虑了
char[] large, small;//定义一个大的数和一个小的数要用到的数组
if (a.length() >= b.length()) {
large = a.toCharArray();
small = b.toCharArray();
} else {
large = b.toCharArray();
small = a.toCharArray();
}
//最终结果的位数应该是大的数的位数加1。注意:如果没有进位,则最高位就为0
int[] sums = new int[large.length + 1];
//计算的时候需要注意一点:char[]拿出来的值是ASCII码,不能对它直接进行计算,此时需要把一个char的数字转换成
//int型的,只需要让它减去‘0’的ASCII码就可以了
for (int i = 0; i < large.length; i++) {
//先把大的数放进sums中,放的时候需要注意:因为要末尾对齐,所以为了便于操作,让sums的第一个元素代表个位
//因此从large中取元素的时候要从最后一个开始拿
sums[i] = large[large.length - i - 1] - '0';
}
for (int i = 0; i < small.length; i++) {
//加第二个数的时候先不考虑进位的情况,直接从small的个位元素把它加进去
sums[i] += small[small.length - i - 1] - '0';
}
//此时当我们再去遍历small时,就会发现里面会出现大于10的元素,所以,需要开始处理进位的问题
for (int i = 0; i < sums.length - 1; i++) {
if (sums[i] > 9) { //如果当前位的数大于9了,说明此时就需要进位了,进位的时候进给它的下一位就可以了
sums[i + 1] += 1;//因为两个数相加,最多只会进1,所以直接加1即可
sums[i] %= 10;//此时当前位上的数就 = 对10取模之后的结果
}
}
StringBuilder builder = new StringBuilder();//最后再将结果进行一个拼接
//因为sums[]这个数组中,第一个元素代表的是个位,所以在拼接的时候,需要反着来,从后往前拼
for (int i = sums.length - 1; i >= 0; i--) {
builder.append(sums[i]);
}
String result = builder.toString();
//此时还需要注意一个问题,最高位到底有没有进位?
if (result.startsWith("0")) {
//如果当前的最高位是0的话,说明并没有进位,所以此时需要把最高位去掉
result = result.substring(1);
}
//此时的result即为最终的结果
System.out.println(result);
}
}