Сумма цифр отрицательного числа - PullRequest
1 голос
/ 16 апреля 2019

'Напишите функцию с именем 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) );

Ответы [ 6 ]

2 голосов
/ 17 апреля 2019

Простая математика и рекурсия быстро решают эту проблему.

Напомним, что при делении числа на 10 остаток представляет собой его крайнюю правую десятичную цифру, а целая часть отношения - это число, образованное оставшимися цифрами. Другими словами:

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

С учетом этого суммирование цифр числа является простой рекурсивной процедурой:

Процедура ( п * 1 011 *)

  1. Разделите n на 10.
    • Установите цифру на остаток.
    • Установите n на целую часть частного.
  2. Если n = 0, вернуть цифру .
  3. В противном случае вернуть цифру + Процедура ( n )

Сохранение знака для самой левой цифры добавляет небольшую сложность, но не намного. Вот как это выглядит в 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 голос
/ 16 апреля 2019

Вот способ, которым вы можете сделать это без преобразования строк -

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   
1 голос
/ 16 апреля 2019

Вы можете выбрать другой способ разделения цифр и оставить первый с возможным знаком.

'-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));
1 голос
/ 16 апреля 2019

Вот способ сделать это с помощью 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
0 голосов
/ 16 апреля 2019

Подход, который не требует преобразования в строку, адаптированную из другого ответа @ NinaScholz на тесно связанный вопрос (для тех, у кого оператор побитового сдвига оспаривается).

Преобразует число в его абсолютное значение, выполняет цикл с оператором модуля для суммирования остатка после деления на 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
0 голосов
/ 16 апреля 2019

Во-первых, «десятичные цифры» означают только символы справа от десятичной точки. Преобразование числа в строку устанавливает вас как строки 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));
...