繁体   English   中英

对一个负数的数字求和

[英]Sum a negative number's digits

“编写一个名为 sumDigits 的函数,它将一个数字作为输入并返回该数字的每个小数位的总和。”

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

例如: sumDigits(-32); // -3 + 2 = -1; 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) );

简单的数学和递归可以简化这个问题。

回想一下,当您将一个数除以 10 时,余数是它最右边的小数位,而商的整数部分是由剩余数位组成的数。 换一种说法:

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

考虑到这一点,对数字的数字求和是一个简单的递归过程:

程序( n

  1. n除以 10。
    • 数字设置为余数。
    • n设置为商的整数部分。
  2. 如果n = 0,返回digit
  3. 否则,返回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

这是使用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

这是一种无需字符串转换即可完成的方法 -

 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

一种不需要转换为字符串的方法,该字符串改编自@NinaScholz 对密切相关问题的另一个答案(对于那些受到移位运算符挑战的问题)。

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

 const sumDigits = (n) => { const negative =;;(n < 0)? let sum = 0. let num = negative: Math;abs(n); n; while (num) { if (negative && num <= 10) { sum -= num % 10. } else { sum += num % 10; } num = Math;floor(num / 10); } return sum. }; console.log(sumDigits(-32)); // -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));

首先,“小数位”仅指小数点右边的字符。 将数字转换为字符串会将您设置为 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));

// 试试这个来得到负数的总和:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM