簡體   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