将负数相加

时间:2019-04-16 19:53:43

标签: javascript reduce

  

'编写一个名为sumDigits的函数,该函数以数字作为输入,   返回每个数字的小数之和   数字。”

如何将第一位为负的数字相加?

例如:sumDigits(-32); // -3 + 2 = -1;

我能够部分解决它。

function sumDigits(number) {
  return Math.abs(number).toString().split("").reduce(function(a, b) {
    return parseInt(a) + parseInt(b);
  }, 0);
}

console.log( sumDigits(-32) );

7 个答案:

答案 0 :(得分:2)

简单的数学运算和递归可以使该问题的解决方法简短化。

回想一下,当您将数字除以10时,余数是其最右边的十进制数字,商的整数部分是由余数构成的数字。换句话说:

let n = 5678;
console.log(n % 10); // => 8
console.log(Math.floor(n / 10)); // => 567

请记住,将数字加起来是一个简单的递归过程:

  

过程( n

     
      
  1. n 除以10。      
        
    • digit 设置为余数。
    •   
    • n 设置为商的整数部分。
    •   
  2.   
  3. 如果 n = 0,则返回 digit
  4.   
  5. 否则,返回 digit + Procedure( n
  6.   

将符号保留在最左边的数字会增加少量的复杂性,但并不会增加很多复杂性。这是在JavaScript中的外观:

function digitSum(n, sign=1) {
  if (n < 0) {
    sign = -1; // Save the sign
    n = Math.abs(n);
  }

  const digit = n % 10; // Remainder of |n÷10|
  n = Math.floor(n / 10); // Integer part of |n÷10|

  if (n === 0) {
    return sign * digit; // No digits left, return final digit with sign
  }
  return digit + digitSum(n, sign); // Add digit to sum of remaining digits
}

console.log(digitSum(32)); // => 5
console.log(digitSum(-32)); // => -1

答案 1 :(得分:1)

这是使用Array.prototype.reduce()的一种方法。

  1. 将输入字符串化并按每个字符将其分割。
  2. 使用reduce遍历字符。
    1. 用总和0和乘数1初始化累加器。
    2. 如果第一个字符是-,则将乘数设置为-1
    3. 对于后续字符,将数字乘以乘数并将其加到总和上。然后将乘数设置回1,以便接下来的数字仅乘以1。

const sumDigits = x => [...`${x}`].reduce(({ sum, mult }, x, i) => {
  return i === 0 && x === '-' ? { sum: 0, mult: -1 } : { sum: sum + mult * x, mult: 1 };
}, { sum: 0, mult: 1 }).sum;

console.log(sumDigits(-32));  // -1
console.log(sumDigits(32));   //  5
console.log(sumDigits(5555)); //  20

答案 2 :(得分:1)

您可以采用其他方法来分隔数字,并使第一个数字带有可能的符号。

'-32'.match(/-?\d/g)
     

返回

['-3', '2']

function sumDigits(number) {
    return number.toString().match(/-?\d/g).reduce(function(a, b) {
        return a + +b;
    }, 0);
}

console.log(sumDigits(-32));

答案 3 :(得分:1)

这是无需字符串转换即可实现的方式-

const sumDigits = (n = 0) =>
  n < 0
    ? n > -10
      ? n
      : (-n % 10) + sumDigits (n / 10 >> 0)
    : n < 10
      ? n
      : (n % 10) + sumDigits (n / 10 >> 0)
      
      
console.log(sumDigits(-321))
// (-3 + 2 + 1)
// => 0

console.log(sumDigits(321))
// (3 + 2 + 1)
// => 6   

使用命令式样式的相同答案-

const sumDigits = (n = 0) =>
{ if (n < 0)
    if (n > -10)
      return n
    else
      return (-n % 10) + sumDigits (n / 10 >> 0)
  else
    if (n < 10)
      return n
    else
      return (n % 10) + sumDigits (n / 10 >> 0)
}     
      
console.log(sumDigits(-321))
// (-3 + 2 + 1)
// => 0

console.log(sumDigits(321))
// (3 + 2 + 1)
// => 6   

答案 4 :(得分:0)

首先,“十进制数字”仅表示小数点右边的字符。将数字转换为字符串会设置您的位置,因为JavaScript字符串是字符数组。因此,接下来的工作就是拆分十进制数字,然后通过迭代该数组对其求和,然后转换回数字类型。

//'Write a function named sumDigits which takes a number as input and returns the sum of each of the number's decimal digits.'

var a = 10.12345;
var b = -1012345;

function sumDigits(x){
  var result = 0;
  x = x.toString();
  x = x.split('.')[1];
  if (x == null){
    //there's not decimal digits to sum!
    return "there's not decimal digits to sum!"
  }
  for (var i = 0; i < x.length; i++) {
    if (digit >= 0 && digit <= 9) { //just in case, probably unnecessary
      var digit = Number(x[i]);
      result = result + digit;
    }
  }
  //if you care about negative uncomment this
  //if(x[0] === "-"){
  //  result = result * -1;
  //}
  return result;
}

console.log(sumDigits(a));
console.log(sumDigits(b));

答案 5 :(得分:0)

一种无需转换为从another answer by @NinaScholz到一个紧密相关的问题(对于受到bitwise shift operator挑战的问题)的字符串的方法。

将数字转换为其绝对值,使用模运算符循环以将除以10后的余数求和,直到剩下一个值为止,如果原始数为负,则减去最左边的数字。

const sumDigits = (n) => {
  let sum = 0;
  let neg = n < 0 ? true : false;
  n = neg ? Math.abs(n) : n;
  while (n) {
    if (neg && n <= 10) {
      sum -= n % 10;
    } else {
      sum += n % 10;
    }
    n = Math.floor(n / 10);
  }
  return sum;
}

console.log(sumDigits(-32));
// -1

答案 6 :(得分:0)

//尝试此操作以获得负数之和:

const sumOfNegative = (numbers) => {
  let sum = 0;
  numbers.forEach((number) => {
    if (number < 0) {
      sum += number;
    }
  });
  return sum;
};