【问题标题】:Summing a number's digits将数字的位数相加
【发布时间】:2020-04-26 14:45:26
【问题描述】:

我的代码如下。有人能看到我犯的错误吗?

编写一个名为 sumDigits 的函数,该函数接受一个数字作为输入,并返回该数字的每个十进制数字的绝对值之和。例如:

sumDigits(10);  // Returns 1
sumDigits(99);  // Returns 18
sumDigits(-32); // Returns 5
Let's assume that all numbers in the input will be integer values.

function sumDigits(number) {
  let numberstring = number.toString()
  let numberarr = numberstring.split("")
  let counter = 0
  for(var i=0; i<numberarr.length; i++) {
    if(typeof numberarr[i] === "number") {
        console.log(numberarr[i])
        let numbervalue = Number(numberarr[i])
        console.log(numbervalue)  
        counter += numbervalue
    } else if (typeof numberarr[i] !== "number"){
      counter += 0
    }
  } 
  return counter
}

【问题讨论】:

  • 你遇到了什么问题?
  • 问题是typeof numberarr[i] === "number" 将永远是false,因为numberarr 包含strings。
  • 它没有通过第一个 if 语句...
  • 你可以用isNaN(..)替换它
  • 这能回答你的问题吗? Sum all the digits of a number Javascript

标签: javascript algorithm


【解决方案1】:
console.log(Math.abs(sumDigits(10)));  // Returns 1
console.log(Math.abs(sumDigits(99)));  // Returns 1
console.log(Math.abs(sumDigits(-32)));  // Returns 1 // Returns 5
//Let's assume that all numbers in the input will be integer values.

function sumDigits(number) {
  var counter = 0;
    var remainder;
    number=Math.abs(number);
        while(number>0){
            counter=counter+number%10;
            number=Math.floor(number/10);
        }
        return counter;
  } 

我认为您正在寻找这样的代码。我不明白你为什么将你的数字转换为字符串。

number=Math.abs(number); this line first convert any negative number to positive.

sumDigits(number) takes an argument as now loop through the number until number < 0 then add the remainder to counter variable then return counter as final sum

【讨论】:

    【解决方案2】:

    试试这个解决方案:

    console.log(sumDigits(-103));  // Returns 4
    
    function sumDigits(number) {
        var numberstring = number.toString();
    
        var counter=0;
        for(var i=0; i<numberstring.length; i++){
            if(parseInt(numberstring.charAt(i))){
                counter += parseInt(numberstring.charAt(i));
            }
        }
        return counter;
    }

    【讨论】:

    • 试试 sumDigits(-103)
    【解决方案3】:

    这个

    if(typeof numberarr[i] === "number")

    语句总是假的,因为在你将数字转换成字符串之前。我认为你的函数总是返回零。

    【讨论】:

      【解决方案4】:

      giovybus 和 Raman 的答案是正确的,如果您想知道为什么您的 sn-p 不起作用 - 这是因为 numberer[I] 的引用始终是一个字符串。 numberarr 是字符串数组,不是数字数组,使用前需要先转换为数字。对上面的代码进行如下调整

      sumDigits(10);  // Returns 1
      sumDigits(99);  // Returns 18
      sumDigits(-32);
      
      function sumDigits(number) {
        let numberstring = number.toString().replace("-", "");
        let numberarr = numberstring.split("")
        let counter = 0
         
        for(var i=0; i<numberarr.length; i++) {
          const numbervalue = Number(numberarr[i])
          if(typeof numbervalue === "number") {
              counter += numbervalue
          } else if (typeof numbervalue !== "number"){
            counter += 0
          }
        } 
        console.log(counter)
        return counter
      }

      但这不是一个好的解决方案,您应该考虑使用 giovybus、Raman 或其他任何具有更好方法的解决方案。

      【讨论】:

        【解决方案5】:

        使用 filter 和 reduce 计算总数。

        function sumDigits(number) {
          return ( [...number.toString()]
            .filter( (char) => !isNaN(parseInt( char ) ) )
            .reduce( function(a,b) { return a + parseInt(b) }, 0) );
        }
        const sum1 = sumDigits(103);
        console.log( sum1 );
        const sum2 = sumDigits(-105);
        console.log( sum2 );

        【讨论】:

          【解决方案6】:

          使用最新的 ES6 语法...

          function sumDigits(num) {
              return [...num.toString()].map(Number).reduce((acc, val) => acc + val, 0);
          };
          
          console.log(sumDigits(55)); // 10
              
          

          棘手部分的解释:

          这会将字符串拆分为一个数字数组:

          [..."1234"] // => [ "1", "2", "3", "4" ] 
          

          这会将其转换为数字

          [ "1", "2" ].map(Number) //  => [ 1, 2 ]
          

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 2013-02-03
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-01
          相关资源
          最近更新 更多