美文网首页
前端-大数相加

前端-大数相加

作者: FConfidence | 来源:发表于2018-09-07 23:54 被阅读21次
    1. 大数相加
    /**
     * [add0Before description] 给String类型的a前面补充num0个0,  返回补充0后的字符串
     * @param  {[String]} a    [数字类型的字符串]
     * @param  {[Integer]} num0 [补充的0的个数]
     * @return {[String]}      [返回长度为a.length+num0]的长度的字符串
     */
    function add0Before(a, num0) {
        if (num0 <= 0) {
            return a;
        }
        for (var i = 0, length = num0; i < length; i++) {
            a = '0' + a;
        }
        return a;
    }
    
    /**
     * [大数相加]
     * @param  {[Array]} a [数组a, 里面是字符串类型的个位数]
     * @param  {[Array]} b [数组a, 里面是字符串类型的个位数]
     * @return {[Array]}   [返回相加之和的数组]
     */
    function plus(a, b) {
        //a, b 两数串位数统一
        var aLength = a.length,
            bLength = b.length,
            // 数组长度相差绝对值
            extra0 = Math.abs(aLength - bLength),
            // 对新数组进行操作, 重命名
            newA = a,
            newB = b,
            // 记录结果字符串
            newC = '',
            // 记录结果数组的长度
            lastLength,
            // 标记进位
            takeOver = 0;
    
        // 对短的数组进行补位0处理
        if (aLength < bLength) {
            newA = add0Before(a, extra0);
        } else {
            newB = add0Before(b, extra0);
        }
    
        // newA+newB   newA的长度和newB的长度是一样的
        lastLength = newA.length;
        for (var i = lastLength - 1; i >= 0; i--) {
            // 从后往前相加, takeOver 表示上一次相加的进位值
            var nSum = parseInt(newA[i]) + parseInt(newB[i]) + takeOver;
            if (nSum >= 10) {
                takeOver = 1;
                // 相加的和大于10的话, newC表示要存进字符串中的值, 需要减掉10
                newC = (nSum - 10) + newC;
            } else {
                takeOver = 0;
                // 此时无进位,  将nSum加载原有字符串的头部;  (ps: 这里是字符串相加)
                newC = nSum + newC;
            }
        }
    
        // 第一位的时候  需要处理的进位处理  比如: 808+102 = 1000
        if (takeOver === 1) {
            newC = 1 + newC;
        }
        return newC;
    }
    
    // console.log(plus('0', '0'))
    console.log(plus("1234123412341234123412341234", "12341234"))
    
    // 0 +1 + .....99999999 (n)
    

    相关文章

      网友评论

          本文标题:前端-大数相加

          本文链接:https://www.haomeiwen.com/subject/rkzhgftx.html