实现‘字符串加法’,即将两个以字符串形式表示的数字相加,获得结果真后返回一个新的字符串。javascript
例如:输入‘123’,‘321’,返回‘444’。前端
这样在进行两个任意大的整数相加的时候,既不会溢出,也不会损失精度。java
function sumStrings(a,b) { var result = [], count = 0; if(a.length < b.length) b=[a, a=b][0]; b=Array(a.length-b.length+1).join('0')+b; var arrA = a.split(''); var arrB = b.split(''); for(var j=0; j<a.length; j++) { var temp = (Number(arrA.pop()) + Number(arrB.pop())) +count; temp>=10?[temp,count]=[temp-10,1]:count=0; result.push(temp); } result.push(count); return result.reverse().join('').replace(/^0+/,''); }
实现分两步:数组
1 为输入中较小的一个数前端补0,使得两个数同样长。在那以前为了肯定给哪一个数补0首先进行了一次比较。blog
2 将两个数的最后一位依次pop出,进行相加,并存储到result数组中。若是相加的结果大于10,取个位数部分,并使得进位符号count+1。简单来讲就像小学时学加法那样,循序渐进就对了。ip
最后获得result数组,还不是咱们要的结果,咱们须要对它反转,而后转换成字符串,还有去除最前面的0.字符串
function sumStrings(a,b){ var res='', c=0; a = a.split(''); b = b.split(''); while (a.length || b.length || c){ c += ~~a.pop() + ~~b.pop(); res = c % 10 + res; c = c>9; } return res.replace(/^0+/,''); }
一看之下简洁了不止一点点……
改进的地方在于:it
1. 没有上面提到的第一步,不用补0,不用判断哪一个数大,如此一来清楚了很多。io
2. 没有使用count变量表明进位,直接将相加结果和进位变量记录在了一个变量c里,function
3. 使用 ~~a 而不是Number(a)来进行格式转换。