'编写一个名为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) );
答案 0 :(得分:2)
简单的数学运算和递归可以使该问题的解决方法简短化。
回想一下,当您将数字除以10时,余数是其最右边的十进制数字,商的整数部分是由余数构成的数字。换句话说:
let n = 5678;
console.log(n % 10); // => 8
console.log(Math.floor(n / 10)); // => 567
请记住,将数字加起来是一个简单的递归过程:
过程( n )
- 将 n 除以10。
- 将 digit 设置为余数。
- 将 n 设置为商的整数部分。
- 如果 n = 0,则返回 digit 。
- 否则,返回 digit + Procedure( 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 :(得分:1)
这是使用Array.prototype.reduce()的一种方法。
-
,则将乘数设置为-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;
};