codewars是一个在线编程网站,其奖励机制像打怪升级。你不能查看高于你级别的问题的答案。除非自己通过提交测试。通过提交之后可以看到各种解法排行榜 。通过对比自己解法和排行榜对比,可以找到差距,提高能力。
题目描述: 简言之,就是对把两个字符串像整数的加法一样相加,比如 本来‘1’+‘2’=‘12’,函数就要实现‘1’ + ‘2’ = ‘3’。
相信很多人第一次看到认为在JavaScript里的Number()或者parseInt函数先转化为数字,然后相加然后将结果用toString()函数再转换为字符串不就OK了,这对于数字比较小的时候使没问题的,但是如果数字很大,编译器会自动
用科学计数法表示,比如 1.25+e12,此时用toString函数转化的结果是 "1.25+e12",这是不符合要求的,所以这里的难点其实是大数相加,在 c++里 大数相加维数不确定,我们不能用int或者double表示,因为int或者double的存储大小都是有限的,就要用字符型数组存储,实现相加,具体点击c++版大数相加 。
JavaScript版我的代码:
function sumStrings(a,b) {
//////////将字符串转为数组,并且字符型数字转为数字型
var arr1 = a.split('').map(function(item) {
return Number(item) ;
}) ;
var arr2 = b.split('').map(function(item){
return Number(item);
});
var len1 = arr1.length;
var len2 = arr2.length;
var len = len1 > len2 ? len1 : len2 ;
var i =0 ;
/////////////////对于当两个数字位数不相同时,对位数少的数字前面补0
if (len1 < len) {
for(i = 0; i < len -len1 ; ++ i){
arr1.unshift(0);
}
}
if (len2 < len) {
for( i =0 ;i < len - len2 ; ++i){
arr2.unshift(0);
}
}
////////////////对两个数组逐位相加,要特别注意有没有进位的情况
var result = [];
var nSum = 0;
var carry = 0; //进位标志
for ( i = len -1 ; i >= 0; i--) {
nSum = arr1[i] + arr2[i] + carry;
if (nSum > 9) {
carry = 1;
nSum -= 10 ;
} else {
carry = 0;
}
result.unshift(nSum ) ;
}
if (carry) {result.unshift(carry);
} ; //////////////转为字符串,注意如果和的前面有0,例如 0789,要将前面的0删除。 while( result[0] == '0'){
result.shift() ;
}; return result.join('');}
排行榜程序第一程序:
String.prototype.reverse = function() {
return this.split('').reverse.join('');
}
function sumStrings(a,b) {
var a = a.reverse() ; var b = b.reverse();
var carry = 0; var index = 0; var sumDigits = [] ;
while( index< a.length || index < b.index || carry != 0){
var aDigits = index < a.length ? parseInt(a[index]) :0;
var bDigits = index < b.length ? parseInt(b[index]) : 0;
var digitSum = aDigits + bDigits + carry ;
sumDigits.push( Math.floor(sigitSum) /10);
carry = digitSum % 10 ;
index ++ ;
}
sumDigits.reverse();
while( sumDigits[0] == '0' ){
sumDigits.shift();
}
return sumDigits.join('');
}