【问题标题】:Sum all the digits of a number Javascript总结一个数字的所有数字Javascript
【发布时间】:2016-07-12 16:40:37
【问题描述】:

我是新手。

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

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

请帮帮我

【问题讨论】:

标签: javascript numbers sum digits


【解决方案1】:

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

  • 数值运算

    取这个数字并构建十的余数并添加它。然后取数字除以 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"/>

【讨论】:

  • 非常感谢
  • @Nina,为什么要精确取模 10?您介意对此进行扩展吗?
  • @Daniel,余数运算符用于获取加到 sum 的数字。
  • 对于第二种解决方案“使用字符串操作”如果我使用数字 0123 而不是 2568 答案是错误的。
  • 不要使用前导零的常量值。
【解决方案2】:

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

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

【讨论】:

  • 其实11 % 9 = 2,不是1,所以1 + 2 = 3
  • 注意:它递归地找到数字的总和(从问题的标题和接受的答案中不清楚)
  • @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 将整个数轴向左移动一位时,您也正确地得到了九。之后,您只需再次添加 1。
  • @FedericoAntonucci 显然,对于所有大于 10 且除以 9 时余数为 1 的数字,它都会失败。例如。 19, 28, 37, 46, ... 等等。对于这些情况,该函数应返回 10,而是返回 1。
  • @R3l1c 该函数应该递归返回总和,这正是问题所要求的,请再读一遍。这个解决方案非常适合这个问题
【解决方案3】:

让我们试试递归

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

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

【讨论】:

    【解决方案4】:

    用数学公式:

    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)
        );
    }
    

    【讨论】:

      【解决方案5】:

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

      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 的 recursive solution 应该更有效,但如果您需要,它不会为您提供中间数字总和。

      【讨论】:

      • 问题是关于数字的递归总和
      • @FedericoAntonucci 但你没有将你的函数命名为sumDigitsRecursively,它确实让我失望了,因为我正在寻找只求和数字的方法。我的答案包含与您的结果相同的解决方案。你为什么拒绝我的回答?
      • 因为递归解决方案并不比其他所有答案都好,而且它是不太优雅的解决方案
      • 我只是在寻找数字的数字总和时来到这里,并且接受的答案不包含只接收数字并返回总和的函数。所以我做到了。接受的解决方案拨打Math.float,但没有必要这样做。所以对于我的任务,这是一个更好的解决方案。此外,递归版本的效率只比你的低一点(我在答案中写过),但它很容易理解。另一方面,你没有解释你的解决方案是如何工作的,也没有正确命名它,所以这给我和@Raknos13 造成了困惑。
      • 我只是在回答这个问题,它并没有问你在说什么,你应该阅读整个问题,而不仅仅是标题
      【解决方案6】:

      扩展@fethe 的答案,这个sumOfDigit 函数能够处理大量数字或BigInt

      function sumOfDigits(n) { 
        return (Number.isSafeInteger(n)) ? (--n % 9) + 1 : Number((--n % 9n) + 1n);
      }
      
      console.log(sumOfDigits(101)); // 2
      console.log(sumOfDigits(84932)); // 8
      console.log(sumOfDigits(900000000000000000000000009n)); // 9
      

      【讨论】:

        【解决方案7】:

        你可以这样做。

        function sums(input) {
            let numArr = input.toString().split('');
            let sum = numArr.reduce((a, b) => Number(a) + Number(b));
            return sum < 10 ? sum : sums(sum);
        }
        

        【讨论】:

          猜你喜欢
          • 2014-05-18
          • 1970-01-01
          • 2012-06-23
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-29
          相关资源
          最近更新 更多