java 大数字相加(如两个500位数字相加)

这两天忙里偷闲,由稍稍看了下数据结构,看到网上有许多关于两个大数字相加的问题,我这边也就顺便写了一个,好了,闲话不多说,直接上代码


 //两个大数字相加
    public static String numberPlus(String s1, String s2) {

        //将数字转换成char类型的数组,然后每一位进行运算
        char[] char1;
        char[] char2;

        //计算前区分,令char1 为长的那个字符创转换成的数组.+
        if (s1.length() > s2.length()) {
            char1 = s1.toCharArray();
            char2 = s2.toCharArray();
        } else {
            char1 = s2.toCharArray();
            char2 = s1.toCharArray();
        }
        //flag 进位标识,末位相加进位的话前面一位需要加上进位
        int flag = 0;
        //创建一个list接收两个数组相加的结果
        List<Integer> resultList = new ArrayList<>();
        //遍历相加
        for (int i = char1.length - 1; i >= 0; i--) {
            //字母与数字之间的类型转换
            int a = Integer.parseInt(String.valueOf(char1[i]));
            //初始化,数组char2 短一些
            int b = 0;
            //计算,使得char1与char2 末位相加
            if (i - (char1.length - char2.length) >= 0) {
                b = Integer.parseInt(String.valueOf(char2[i - (char1.length - char2.length)]));
            }
            //两个数字相加,同时加上进位,
            //注意:flag 的设置一定要放在相加后面,因为相加要使用当前的flag,如果提前设置,flag的作用就没有起到。
            resultList.add((a + b + flag) % 10);
            flag = (a + b + flag) / 10;
        }
        //最后进位处理
        if(flag!=0){
            resultList.add(flag);
        }
        
        StringBuffer buffer = new StringBuffer();
        //逆向遍历,因为加的时候是从末位开始加的,首位的在后面。
        for (int i = resultList.size() - 1; i >= 0; i--) {
            buffer.append(resultList.get(i));
        }
        //相加结果字符串返回。
        return buffer.toString();
    }

这就是一个基本的静态方法,注释我已经写的比较明了,这里就不啰嗦了,下面来测试下这个方法

 public static void main(String[] args) {
        //定义俩个大数字
        String s1 = "124354765868776765455344234299999993";
        String s2 = "823435435888888888888888435499";
        //使用BigDecimal,方便后面直接计算正确结果进行对比。
        BigDecimal b1 = new BigDecimal(s1);
        BigDecimal b2 = new BigDecimal(s2);

        System.out.println("程序:"+numberPlus(s1,s2));
        System.out.println("真实:"+b1.add(b2));

    }

看下返回:

结果自然是比较坚挺的!大家可以看到,两个大数字相加无非是将数字转化为数组,然后对位相加。也有些喜欢将短的那个数字前位加零,这样的话就不用进行 这一步的计算。

//计算,使得char1与char2 末位相加
            if (i-(char1.length-char2.length)>=0) {
                b = Integer.parseInt(String.valueOf(char2[i-(char1.length-char2.length)]));
            }
    

不过殊途同归,都是这一种思想,只要你掌握了这种思想,方法的实现就看你自己的爱好了,哈哈,下次见

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔下天地宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值