2017-01-29 5 views
2

Мне нужно сделать функцию, которая принимает число и возвращает сумму его цифр, если число отрицательно, первая цифра должна считаться отрицательной при добавлении чисел, это то, что я имеют:Сумма возврата (положительная или отрицательная)

var arrx = []; 
var oper; 
var others = 0; 

function sumDigits(num) { 
    // your code here 
    var y = num.toString(); 
    var c = y.split(""); 
    c.forEach((h) => arrx.push(Number(h))); 
    if (num < 0){ 
     oper = -arrx[0]; 
     for (var z = 1; z < arrx.length; z++){ 
      others += arrx[z]; 
     } 

     return others + oper; 
    } 

    return arrx.reduce((a,b) => a+b); 
} 

sumDigits(1234); 

При заданном отрицательном числе функция возвращает NaN, в чем проблема?

+0

Почему вы раздвинуть цифры в массив, когда 'c' уже один ? –

+0

Я предлагаю разработать алгоритм, который работает непосредственно с числами, а не преобразовывать число в строку. Можете ли вы подумать о том, как получить цифру от числа? Как вы получите остальную часть номера, кроме цифры? –

ответ

1

Использование оптимизированной и короткая версия sumDigits() функции:

function sumDigits(num) { 
 
    var isNeg = num < 0, // check whether the number is negative 
 
     numbers = (isNeg? String(num).slice(1) : String(num)).split('').map(Number); 
 
    if (isNeg) numbers[0] *= -1; // 'recovering' the number's sign 
 

 
    return numbers.reduce(function(a,b){ return a + b; }); 
 
} 
 

 
console.log(sumDigits(1234)); 
 
console.log(sumDigits(-951));

+0

Очень красивый человек, спасибо. –

+0

@FairPlay, добро пожаловать – RomanPerekhrest

+0

У меня возникли проблемы с пониманием значения в числах. Если бы я написал это, было бы так? 'if (isNeg) {String (num) .slice (1); } else {String (num); } numbers.split (''). map (Number); ' ? –

1

В случае отрицательного номера первый символ - '-' минус символ. Когда вы пытаетесь преобразовать его в число, вы получаете NaN. После этого, если вы попытаетесь добавить NaN в любое число, результат будет NaN.

В качестве разрешения вам необходимо проигнорировать первую цифру, если число отрицательное.

Таким образом, вы можете внести изменения кода, как

if(z === 1){ 
    others = others - arrx[z]; 
    }else{ 
    others += arrx[z]; 
     } 

, а также изменяющегося возвращение в случае отрицательных чисел в return others;

Этот код должен работать.

var arrx = []; 
 
var oper; 
 
var others = 0; 
 

 
function sumDigits(num) { 
 
// your code here 
 

 
var y = num.toString(); 
 

 
var c = y.split(""); 
 

 
c.forEach((h) => arrx.push(Number(h))); 
 

 
if (num < 0){ 
 

 

 
for (var z = 1; z < arrx.length; z++){ 
 

 
    if(z === 1){ 
 
    others = others - arrx[z]; 
 
    }else{ 
 
    others += arrx[z]; 
 
     } 
 

 
} 
 

 
return others; 
 
} 
 

 
return arrx.reduce((a,b) => a+b); 
 

 
} 
 
console.log(sumDigits(-1234));

+0

Если я проигнорирую его, результат будет отрицательным в случае отрицательного числа. –

+0

Проверьте код в сообщении, он должен работать, это почти то же самое, за исключением условия 'return' и' if'. – Agalo

Смежные вопросы