面试题-不使用数字类型来运算大型数字字符串

记一次和同学上班无聊讨论一个面试题的做法

在这里用笨拙的方法调试出了结果,如果有不对,还望多多包涵并指出.

实现思想是使用char上升int不会有精度损失.但是这里有个小坑就是char转换int 是使用ASCII码  所以需要减去48

从最右边的个位数开始算起,所以短的字符串和长的字符串之间的差异长度,需要额外处理

不多说 上代码 直观

        String s1 = "87534683132454341354654654646545641387313849681815152182318971318413864103588461310843018646103215131380432108560480";
        String s2 = "456456465464645465465465465465456465464564654654564654654654546546454654654564654645646546545646546546545465464";
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        //短字符串 与 长字符串 差异长度
        int subLen = c1.length - c2.length;
        int inTmp = 0;//进位数
        StringBuilder sb = new StringBuilder(128);//记录字符 反序,最后需要reverse反转一下
        for (int i = c1.length-1; i >= 0;i--){
            //如果当前长度取到 c2 的最前位,则停止取值 否则索引越界
            if (subLen > i){
                if (inTmp > 0 ){
                    //如果当时进位是1  则需要加上进位的值
                    int result = c1[i] + inTmp - 48;//减去48 是char转int ascii 转码问题
                    if (result>=10){
                        //如果大于10 则进位为1  应该加入到下次计算当中
                        result = result - 10;
                        inTmp=1;
                    }else{
                        inTmp=0;//没有进位 重置为0
                    }
                    sb.append(result);
                }else{
                    //进位为0 直接取c1的数
                    sb.append(c1[i] - 48);
                }
            }else{
                //c2 应该减去差异长度取得最后一位
                int result = inTmp + c1[i] + c2[i - subLen] - 48 * 2;//只是一个个位数相加 减去48 是char转int ascii 转码问题
                if (result>=10){
                    //如果大于10 则进位为1  应该加入到下次计算当中
                    result = result - 10;
                    inTmp=1;
                }else{
                    inTmp=0;//没有进位 重置为0
                }
                sb.append(result);
            }
        }
        System.out.println(sb.reverse().toString());
        System.out.println("=====================================");
        System.out.println(new BigDecimal(s1).add(new BigDecimal(s2)));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值