求和一个数字的所有数字 Javascript

IT技术 javascript numbers sum digits
2021-01-31 02:27:55

我是新手。

我想做一个小应用程序来计算一个数字的所有数字的总和。

例如,如果我有数字 2568,应用程序将计算 2+5+6+8 等于 21。最后,它会计算 21 的数字之和,最终结果将为 3 。

请帮我

6个回答

基本上你有两种方法来获得一个整数的所有部分的总和。

  • 用数值运算

    取数字并建立十的余数并将其相加。然后取数字除以 10 的整数部分。继续。

var value = 2568,
    sum = 0;

while (value) {
    sum += value % 10;
    value = Math.floor(value / 10);
}

console.log(sum);

  • 使用字符串操作

    将数字转换为字符串,拆分字符串并获得一个包含所有数字的数组,并对每个部分执行归约并返回总和。

var value = 2568,
    sum = value
        .toString()
        .split('')
        .map(Number)
        .reduce(function (a, b) {
            return a + b;
        }, 0);

console.log(sum);


要返回值,您需要添加value属性。

rezultat.value = sum;
//      ^^^^^^

function sumDigits() {
    var value = document.getElementById("thenumber").value,
        sum = 0;

  while (value) {
      sum += value % 10;
      value = Math.floor(value / 10);
  }
  
  var rezultat = document.getElementById("result");
  rezultat.value = sum;
}
<input type="text" placeholder="number" id="thenumber"/><br/><br/>
<button onclick="sumDigits()">Calculate</button><br/><br/>
<input type="text" readonly="true" placeholder="the result" id="result"/>

@Daniel,余数运算符用于获取与总和相加的数字。
2021-03-16 02:27:55
非常感谢你
2021-03-24 02:27:55
@Nina,为什么要对 10 取模?你介意扩展一下吗?
2021-04-13 02:27:55

这种使用模 9 算术的简单方法怎么样?

function sumDigits(n) {
  return (n - 1) % 9 + 1;
}
@FedericoAntonucci 显然,它对于所有大于 10 的数字都失败了,这些数字在除以 9 时的余数为 1。例如。19, 28, 37, 46, ... 等等。对于这些情况,函数应该返回 10,而是返回 1。
2021-03-19 02:27:55
注意:它递归地找到数字的总和(从问题的标题和接受的答案中不清楚)
2021-03-23 02:27:55
实际上11 % 9 = 2,不是 1,所以1 + 2 = 3
2021-03-24 02:27:55
@AlexShevyakov 忽略 -1 和 +1,那么它只是 n%9。由于数字 n=10^k*a_k + 10^(k-1)*a_(k-1)...10^0*a_0。模 9 删除所有 10^i,因为 10^i mod 9 = 1。然后总和也被创建模 9。当您想象 -1 将整个数轴向左移动一位时,您也正确地得到了 9。之后,您只需再次添加 1。
2021-03-27 02:27:55
@R3l1c 函数应该递归地返回总和,这正是问题所问的,请再读一遍。这个解决方案非常适合这个问题
2021-04-02 02:27:55

让我们试试递归

function sumDigits(n) {
  if (n < 10) return n
  return sumDigits(n % 10 + sumDigits(Math.floor(n / 10)))
}

sumDigits(2) // 2
sumDigits(2568) // 3

用数学公式:

function sumDigits(n) { 
    return (--n % 9) + 1;
}

没有数学公式:

function sumDigits(n) {
    if (typeof n !== 'string') {
        n = n.toString();
    }    
    if (n.length < 2) {
        return parseInt(n);
    }
​
    return sumDigits(
        n.split('')
         .reduce((acc, num) => acc += parseInt(num), 0)
    );
}

可以使用该函数计算数字总和(基于其他答案):

function sumDigits(n) {
    let sum = 0;
    while (n) {
        digit = n % 10;
        sum += digit;
        n = (n - digit) / 10;
    }
    return sum;
}

如果您确实需要递归地求和数字,则可以使用该函数的递归版本:

function sumDigitsRecursively(n) {
    let sum = sumDigits(n);
    if (sum < 10)
        return sum;
    else
        return sumDigitsRecursively(sum);
}

sumDigitsRecursively(2568)表达将等于3因为2+5+6+8 = 212+1 = 3

请注意,@FedericoAntonucci 的递归解决方案应该更有效,但如果您需要,它不会为您提供中间数字总和。

我只是在回答问题,它没有问你在说什么,你应该阅读整个问题,而不仅仅是标题
2021-03-22 02:27:55
原因递归解决方案并不比其他所有答案更好,而且它是不太优雅的解决方案
2021-03-29 02:27:55
@FedericoAntonucci,但您没有将您的函数命名为sumDigitsRecursively它,它确实让我感到困惑,因为我正在寻找仅 sumDigits 的方法。我的答案包含与您的结果相同的解决方案。你为什么对我的回答投反对票?
2021-04-03 02:27:55
问题是关于递归数字和
2021-04-11 02:27:55
我在寻找数字的数字总和时到达这里,并且接受的答案不包含仅接收数字并返回总和的函数。所以我做到了。接受的解决方案调用Math.float,但没有必要这样做。所以对于我的任务,这是一个更好的解决方案。此外,递归版本的效率只比你的低一点(我在答案中写过),但很容易理解。另一方面,你没有解释你的解决方案是如何工作的,也没有正确命名它,所以它给我和@Raknos13 造成了混乱。
2021-04-13 02:27:55