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,输出