函数sumDigits;如何使用此函数使用负数?

时间:2017-03-18 19:47:43

标签: javascript

问题:

  

编写一个名为sumDigits的函数。

     

给定一个数字,sumDigits返回其所有数字的总和。

     

var output = sumDigits(1148);
  console.log(output); // --> 14

     

如果数字为负数,则第一个数字应计为负数。

     

var output = sumDigits(-316);
  console.log(output); // --> 4

这是我目前已编码的内容,它适用于正值,但我无法解决在给定负值时如何解决问题。当-316被放入函数时,会返回NaN,我知道当我toString().split('')时,这是返回的内容:['-', '3', '1', '6']。如何处理索引0和1的组合?

function sumDigits(num) {
  var total = 0;
  var newString = num.toString().split('');
  for (var i = 0; i < newString.length; i ++) {
    var converted = parseInt(newString[i]);
    total += converted;
  }
  return total;
}

sumDigits(1148);

我应该使用哪些方法的任何提示?是否有更明智的方式来看待这个?

4 个答案:

答案 0 :(得分:1)

这应该这样做:

&#13;
&#13;
    function sumDigits(num) {
      var total = 0;
      var newString = num.toString().split('');
      for (var i = 0; i < newString.length; i ++) {
        if(newString[i]==='-') { //check to see if the first char is -
          i++; //if it is, lets move to the negative number
          var converted =  parseInt(newString[i]); // parse negative number
          total -= converted; // subtract value from total
          continue; // move to the next item in the loop
        }
        var converted = parseInt(newString[i]);
        total += converted;
      }
      return total;
    }

console.log(sumDigits(-316));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这样做的一种方法是进行拆分,将第一位和第一位保持在一起,而不是拆分。

您可以使用正则表达式执行此操作,并使用match代替split

var newString = num.toString().match(/-?\d/g);

function sumDigits(num) {
  var total = 0;
  var newString = num.toString().match(/-?\d/g);
  for (var i = 0; i < newString.length; i++) {
    var converted = parseInt(newString[i]);
    total += converted;
  }
  return total;
}

var result = sumDigits(-316);
console.log(result);

在较短的版本中,您可以使用mapreduce,如下所示:

function sumDigits(num) {
  return String(num).match(/-?\d/g).map(Number).reduce( (a, b) => a+b );
}

console.log(sumDigits(-316));

答案 2 :(得分:1)

您始终可以将plot(data$measured~data$fitted, ylab = expression("Measured Length (" * mu ~ "m)"), xlab = expression("NIR Fitted Length (" * mu ~ "m)"), cex.lab=1.5, cex.axis=1.5) 与函数一起用作参数:

String#replace

答案 3 :(得分:0)

  

有没有更智能的方式来看待这个?

您可以使用模运算符提取最后一位数字,从而避免从数字到字符串的转换。重复此步骤,直到找到所有数字:

function sumDigits(num) {
  let total = 0, digit = 0;
  while (num != 0) {
    total += digit = num % 10;
    num = (num - digit) * 0.1;
  }
  return total < 0 ? digit + digit - total : total;
}

console.log(sumDigits(-316));                    // 4
console.log(sumDigits(1148));                    // 14
console.log(sumDigits(Number.MAX_SAFE_INTEGER)); // 76