总结一个数字,直到它成为1位JS

时间:2018-04-18 06:15:49

标签: javascript math

在标记重复的注释之前,它不是。其他人并没有找到与我完全相同的东西。

在javascript中总结一个数字的最紧凑的可行方法是什么,直到只剩下一个数字。例如:您输入5678然后脚本将它们加在一起(5 + 6 + 7 + 8)并获得26,但由于它超过1位数,它再次添​​加它并获得2 + 6 = 8。

无论如何都有这么多的尺寸吗?脚本有多紧凑?

15 个答案:

答案 0 :(得分:11)

如果您正在寻找短片,那就很难被击败:



var n = 5678;
sum  = n % 9 || 9;

console.log(sum)




如果您对其运作方式感到好奇,请参阅:casting out nines.

答案 1 :(得分:6)

你可以使用递归来做到这一点,这是一个例子:

function getOneDigit(nr){
    let asStr = nr.toString();
    let sum = asStr.split("").reduce((a, c) => {
         a+=parseInt(c);
         return a;
    }, 0);
    return sum >= 10 ? getOneDigit(sum) : sum;
}

[234235, 235346, 657234, 1, 2, 5423].forEach(nr => console.log(getOneDigit(nr)));

答案 2 :(得分:2)

这行代码可以做到这一点。

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

当您将数字与9取模时,它变成小于9的1。 因此,当您有10%9时,您将得到1,等于1 + 0。

类似地,123%9 = 6。

为什么(n-1)%9并添加1: 因为当您输入9时,它变为0,所以输入将无效。

对于n = 9,此方法将返回(9-1)%9 = 8和8 + 1 = 9。

所以它不会破裂。

您也可以写

return n%9 || 9

答案 3 :(得分:1)

function fun(n) {
sum = 0;
while(n > 0 || sum > 9)
    {
        if(n == 0)
        {
            n = sum;
            sum = 0;
        }
        sum = sum+n % 10;
        n = Math.floor(n/10);
    }
    console.log(sum);
}

您可以使用上述代码段。

答案 4 :(得分:1)

对于紧凑的方法,您可以使用迭代和递归方法。

const d = n => n > 9 ? d([...n.toString()].reduce((a, b) => +a + +b)) : n;

console.log(d(5678));

答案 5 :(得分:1)

function createCheckDigit(membershipId) {
     var total = membershipId;
   while (total.length > 1) {
       t = 0;
       for (let i = 0; i < total.length; i++) {
               t = Number(t) + Number(total[i]);
       }
       total = t.toString(); 
   }
   return total;
  }
console.log(createCheckDigit("55555"));

答案 6 :(得分:0)

您需要检查值的长度(将sum转换为String后)是否为1。

var fnSum = (arr) => arr.reduce((a, c) => a + (+c), 0); //function to get sum of values

var fnGetSingleDigit = (arr) => {
  while (arr.length != 1) {
    var sum = fnSum(arr);
    arr = String(sum).split("");
  }
  return arr[0];
};

console.log(fnGetSingleDigit([5, 6, 7, 8]));

console.log(fnGetSingleDigit([41,34,3,54,63,46]));

<强>演示

var fnSum = (arr) => arr.reduce((a, c) => a + (+c), 0); //function to get sum of values

var fnGetSingleDigit = (arr) => {
  while (arr.length != 1) {
    var sum = fnSum(arr);
    arr = String(sum).split("");
  }
  return arr[0];
};

console.log(fnGetSingleDigit([5, 6, 7, 8]));

console.log(fnGetSingleDigit([41,34,3,54,63,46]));

答案 7 :(得分:0)

你去吧

var number = 56785;
var total = number + '';
    
while(total.length > 1) {
   var temp = 0;
   for(var i = 0; i < total.length; i++) {
       temp += +total[i];
   }
   total = temp + '';
}
    
console.log(total);

答案 8 :(得分:0)

您还可以选择使用forEach循环和while条件循环stringify数字并获取总和,直到长度为1。

var num = 5678;
var strNum = num.toString().split('');
while(strNum.length !== 1){
  var strNum = calculateSum(strNum);
  strNum = strNum.split('');
}
var result = parseInt(strNum);
console.log(result);

function calculateSum(strNum){
  var sum = 0;
  strNum.forEach((digit)=>{
    sum += parseInt(digit);
  });
  return sum.toString();
}

答案 9 :(得分:0)

这是我在CodeWars上遇到同样问题的解决方案

const sumup = (num) => {
   let a = String(num).split('').map((k) => {
     return Number(k);
   }).reduce((p, c) => {
     return p + c;
   }, 0);

   return a > 9 ? sumup(a) : a;
}

答案 10 :(得分:0)

这是一个不使用任何库的递归解决方案!

&#13;
&#13;
function getSumOfDigits(num){
  var result = 0;
  while(~~(num/10) > 0){
    result += (num % 10);
    num = ~~(num/10);
  }
  return result + num;
}

function getSingleDigit(num) {
  if(~~(num/10) === 0) {
    return num
  } else {
    num = getSumOfDigits(num);
    return getSingleDigit(num);
  }
}

console.log(getSingleDigit(393));
&#13;
&#13;
&#13;

答案 11 :(得分:0)

您可以将一些实用程序方法与递归结合起来,并以两行仍然很容易理解的方式完成:

function sumDigits(digits) {
  let sum = Array.from(digits.toString()).map(Number).reduce((res, val) => res + val, 0);
  return sum < 10 ? sum : sumDigits(sum);
}

console.log(sumDigits(55555)) // 5+5+5+5+5 = 25 -> 2+5 = 7

答案 12 :(得分:0)

function doSum(n){
	var temp = n, total= 0;
		for(var i = 0; i < n.toString().length; i++ ){
    		  total = total + (Math.floor(temp) % 10)
		  temp = (temp / 10)
		}
	if(total > 9 ) { return doSum(total) }
return total
}
doSum(999999)

答案 13 :(得分:0)

我是这样做的:

function sumOfID(__id){
  var arr_str = Array.from(__id)
  var arr = arr_str.map((t)=>{return parseInt(t)})
  function digSum(__arr){
   return __arr.reduce((a,b)=>{return a + b})
  }
   return digSum(arr)%9 || 9    
 }

注意: 这里的诀窍是使用mod9,因为任何多位数的模9都是其总和,直到成为单个数为止。

答案 14 :(得分:0)

// recursive
    function digitSum(n) {
      return (n % 10 === n) ? n : (digitSum(n.toString().split('').reduce((acc, curr) => acc + parseInt(curr), 0)));
    }

    
        
   function digitSum(n) {
       while(!(n % 10 === n)) {
         n = n.toString().split('').reduce((acc, curr) => acc + parseInt(curr), 0);
       }
      
       return n;
    
    console.log(digitSum(467)); // -> 17 -> 8

基本上检查 nums 长度(数字计数长度)< 2(通过 n % 10 === n (9 % 10 === 9) 或 n.toString 实现) ().length < 2 如果不是,则使用计算出的数字总和再次调用该函数 以467为例:

  1. 4 + 6 + 7 = 17(数字长度不是 1)用 17 调用
  2. 1 + 7 = 8(数字长度为 1)-> 返回。 第二个版本与递归版本相同,希望对您有所帮助!