算法 | 大数相加

题目描述:

例如:
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);
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值