codewars打怪升级日记 用JavaScript实现大数相加 /像数字一样加数字型字符串

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) {<pre name="code" class="javascript" style="color: rgb(85, 85, 85); font-size: 18px; line-height: 35px;">result.unshift(carry);
} ; //转为字符串,注意如果和的前面有0,例如 0789,要将前面的0删除。 while( result[0] == '0'){
 result.shift() ;
}; return result.join('');}

 排行榜程序第一程序: 

<pre name="code" class="javascript" style="color: rgb(85, 85, 85); font-size: 18px; line-height: 35px;">String.prototype.reverse = function() {
  return this.split('').reverse.join('');
}
<pre name="code" class="javascript">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' ){
<pre name="code" class="javascript" style="color: rgb(85, 85, 85); font-size: 18px; line-height: 35px;">sumDigits.shift();
 
  }
return sumDigits.join('');
}
 

用到的主要 JavaScript方法: 字符串和数组之间的转换  split  和 join   。字符和数字的装换 parseInt  ,Number  ,toString;数组方法,reverse ,shift,unshif ,


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值