题解 | #大数加法#

大数加法

http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

    //刚开始想的是用java自带的加法运算,会导致数字转换异常
    //因为这里要求字符串的长度为10万,而Long类型的最大值为9223372036854775807,长度为19位,输入字符串转化为整数
    //远远大于Long的最大值,所以这里不能用java自带的加法运算,而是要手动进行十进制的加法运算
    //Long类型最大长度为19位,两个18位的数字相加最大为19位,不会超过long类型的最大值
    //所以字符串分组长度设为18位
    int lengths = s.length();
    int lengtht = t.length();
    //判断s,t分成几组
    int s1 = (lengths%18==0)?lengths/18:(lengths/18+1);//s分组数量
    int t1 = (lengtht%18==0)?lengtht/18:(lengtht/18+1);//t分组数量
    //新建String数组,分别存储s,t字符串分组后的字符串数组
    String[] strings = new String[s1];
    String[] stringt = new String[t1];
    //为字符串数组添加元素
    for(int i=0;i<s1;i++){
        if(i==s1-1){
            strings[i] = s.substring(0, lengths-i*18);
        }else{
            strings[i] = s.substring(lengths-(i+1)*18, lengths-i*18);
        }
    }
    
    for(int i=0;i<t1;i++){
        if(i==t1-1){
            stringt[i] = t.substring(0, lengtht-i*18);
        }else{
            stringt[i] = t.substring(lengtht-(i+1)*18, lengtht-i*18);
        }
    }
    
    int temp = 0;//进位初始为0,两数相加大于10^18时标记进位1;
    StringBuilder  result = new StringBuilder();
    int r = 1;
    int p=0,q=0;
    long jin = (long) Math.pow(10, 18); 
    while(p <s1 || q < t1 || temp > 0){
        long a = (p >= s1)?0:Long.valueOf(strings[p++]);
        long b = (q >= t1)?0:Long.valueOf(stringt[q++]);
        long c = a+b+temp;
        temp = 0;//进位复位为0;
        // 计算进位
        if(c>=jin){
            c = c%jin;//大于等于10时,取个位数 ,进位标记1;
            temp = 1;
        }
        StringBuilder  cc = new StringBuilder(c+"");
       
        //c位前面补0,补足18位
        for(int i=0;i<18-(c+"").length();i++){
            cc.insert(0,"0");
        }
      

// System.out.println("jin:"+jin+ " 第"+ r++ +"趟循环 a :"+a+" b:"+ b +" c:"+ c +" temp:"+ temp +" cc:"+ cc); //将相加结果 result.insert(0,cc);

    }
    //去除前面多余的0
    String newStr = result.toString().replaceFirst("^0*", "");
    //全为0的情况
    if(newStr.equals("")){
        newStr = "0"; 
    }
    return newStr;
全部评论

相关推荐

昨天 17:48
中山大学 C++
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务