JavaScript题解 | #大数加法#

大数加法

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 计算两个数之和
 * @param s string字符串 表示第一个整数
 * @param t string字符串 表示第二个整数
 * @return string字符串
 */
function solve( s ,  t ) {
    // write code here
    return stringAdd(s, t);
}

function stringAdd(a, b) {
    /// 1. 补齐两个数
    let a_arr = a.split('');
    let b_arr = b.split('');
    let dis_a_b = Math.abs(a.length - b.length);
    if(a.length > b.length) {
        while(dis_a_b--) {
            b_arr.unshift(0);
        }
    } else {
        while(dis_a_b--) {
            a_arr.unshift(0);
        }
    }
    // 2. 计算
    let flag = 0, n = 0, sum_arr = [];
    for(let i = a_arr.length - 1; i >= 0; i--) {
        const a_num = a_arr[i] / 1; // str / 1 和 parseInt 效果一致
        const b_num = b_arr[i] / 1;

        const temp_sum = a_num + b_num + flag;
        flag = (temp_sum / 10)>>>0; // >>> 0 和 Math.floot 效果一致
        n = temp_sum % 10; // 获取余数
    
        sum_arr.unshift(n);
    }

    if(flag) {
        sum_arr.unshift(flag);
    }

    res = sum_arr.join('');

    return res;
}

module.exports = {
    solve
};

思路:

按照正常加法过程来模拟大数相加,从个位一直加到最高位,加的过程中涉及到的就是10以内的加减法,把结果的个位保存起来以及产生产生的进制位flag也保存起来。

每次加的时候都要加上flag,在运算最后的时候判断一下flag是否还有值,有的话直接插入(头插)到结果数组里sum_arr。

最后,正向输出结果数组就得到了想要的值。

简化过程:

  • 补齐两个参数String,省去一堆麻烦的判断
  • 从个位(倒序)开始10以内的加法,记录进制位和运算结果个位 flag = Math.floor(sum / 10) , num = sum % 10
  • 两个数加法完毕,判断最后flag是否还有值,有就插入到sum_arr
  • sum_arr转化成String,输出
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 16:22
点赞 评论 收藏
分享
小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
炫哥_:哥们项目描述里面vector和mysql之类的都要写吗,直接开头技术栈巴拉巴拉就行了,完全不是技术点啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务