检查给定号码是否满意

时间:2017-07-25 12:37:09

标签: javascript

这是我的代码,用于检查给定的数字是Happy number。我想我在尝试错误的逻辑。



var num = 5239;
var sum = 0;
while (num > 0) {
  sum += Math.pow(num % 10, 2);
  num = Math.floor(num / 10);
  console.log(num)
}
console.log(sum);
if (num == 0) {
  alert("happy number")
} else {
  alert("Not happy number")
}




请纠正我以获得正确的结果。

6 个答案:

答案 0 :(得分:1)

https://jsfiddle.net/g18tsjjx/1/

如果我理解了什么是幸福号码,那么这应该是正确的。

$(document).ready(function() {
  var num = 1;
  var i = 0;
  for (i; i < 10000; i++) {
    num = newNumber(num);
  }
  num == 1 ? alert("it's happy number") : alert("it's not happy number");
});

function newNumber(num) {
  var sum = 0;
  var temp = 0;
  while (num != 0) {
    temp = num % 10;
    num = (num - temp) / 10;
    sum += temp * temp;
  }
  return sum;
}

答案 1 :(得分:1)

根据维基百科

  

幸福数字是由以下过程定义的数字:开始   使用任何正整数,将数字替换为总和   其数字的方块,并重复该过程,直到该数字   等于1(它将留在哪里),或者它在一个循环中无休止地循环   不包括1.此过程以1结尾的那些数字是   快乐的数字,而那些不以1结尾的数字是不愉快的数字   (或悲伤的数字)。 wikipedia Happy number

我创建了递归函数isHappy,我们将传递数字,所以
考虑到帐户快乐号码定义,并且javascript将trow Uncaught RangeError:超出最大调用堆栈大小当我们无休止循环时,我们将把函数放在中...抓住块,所以这里是最终的代码

//Our Recursive Function
function isHappy(number){

   var output = [],
   sNumber = number.toString();

for (var i = 0, len = sNumber.length; i < len; i += 1) {

    output.push(+sNumber.charAt(i));//converting into number 

  }
  var sum=0;

for(var i=0;i<output.length;i++){
    sum+=Math.pow(output[i],2);
   }

if(sum!==1){
  isHappy(sum);

  }

}



 try{
      isHappy(number);//call the function with given number 
      alert('happy')

    }catch(err){
    alert('unhappy')
    }

答案 2 :(得分:0)

我担心你误解了这个条件:首先应该检查最终的数字是=== 1

你不应该只进行迭代,而是继续直到你达到1或遇到已经解析过的数字。我建议使用哈希来跟踪已经seen的数字。

不要免费做一些功课,这是递归here的一个很好的例子。

答案 3 :(得分:0)

  

这是任何数字的代码。喜欢的数字可以是3,4,5,6,7,8,9位。代码可以帮助你。

&#13;
&#13;
./byfn.sh -m up
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我今天在一次面试中遇到了快乐的数字。 这是我想出的解决方案。

即使我使用了递归,使用可见数集也可以防止堆栈溢出(在某些情况下还可以避免无限循环)。

'use strict';

function happyNumber(n, unluckySet = new Set()) {
  const digitChars = n.toString().split('');
  let sum = 0;
  digitChars.forEach( digitChar => {
    sum += Math.pow(Number.parseInt(digitChar), 2);
  });
  if (sum === 1) return true; // lucky!
  if (unluckySet.has(sum)) return false; // we're unlucky
  unluckySet.add(sum);
  return happyNumber(sum, unluckySet);
}

// print all happy numbers in range 0..100
for (let i = 0; i <= 100; ++i) {
  if (happyNumber(i)) console.log(`${i} is a happy number`);
}

// this still should not cause a stack overflow
const largeHappyNum = 1234567894;
console.log(largeHappyNum, 'is happy:', happyNumber(largeHappyNum));

答案 5 :(得分:0)

根据@Kevin的阐述,我创建了一个JS版本:

function isHappy(n) {
  const next = (n) => {
    let ret = 0;
    for (const digit of `${n}`) {
      ret += (+digit) ** 2;
    }
    return ret;
  };
  while (n !== 1 && n !== 4) n = next(n);
  return n === 1;
}

console.log(isHappy(5239));
console.log(isHappy(19));

相关问题