我正在尝试用Javascript写一个函数,该函数将根据数字是否为Armstrong数字返回truefalse。阿姆斯特朗(Armstrong)数字是将数字的每个数字乘以数字的长度,然后将它们加起来等于原始数字的数字。例如:153是Armstrong号码,因为:153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153

我确定我的函数还有其他问题,虽然不是最漂亮的,但是我对此仍然坚持。

我已经尝试在函数的多个区域周围添加parseInt(),以确保我只处理整数而不处理字符串,而没有任何运气。



const validate = (num) => {
  const numlength = num.toString().length;
  let armstrong;
  let singleDigit;
  for (i = 0; i < numlength; i++) {
    singleDigit = num.toString()[i] ** numlength;
    armstrong += singleDigit;
  }
  if (armstrong == num) {
    return true;
  } else {
    return false;
  }
};

console.log(validate(153))





我面临的问题是armstrong变量由于某种原因返回了NaN。我不太确定如何迭代添加在for语句中找到的singleDigit值。当我在语句中找出console.log(singleDigit)之后,该值正确。如果此后我console.log(armstrong),我得到NaN

最佳答案

您需要将初始值设置为armstrong = 0

默认情况下为undefined,因此当您对undefined执行数学运算时,结果为NaN



const validate = num => {
  let numString = num.toString()
  const numlength = numString.length;
  let armstrong = 0;
  let singleDigit = 0;
  for (let i = 0; i < numlength; i++) {
    singleDigit = numString[i] ** numlength;
    armstrong += singleDigit;
  }
  return armstrong == num
};

console.log(validate(153))







旁注:-


您可以简单地删除最后一个if else语句,armstrong == num已经产生了truefalse
无需在每次迭代中调用toString(),我们只需将其存储在变量中并使用它




另一种方法是使用reduce而不是for循环



const validate = num => {
  let numString = num.toString()
  const numLength = numString.length;
  const armstrong = [...numString].reduce((acc, r) => acc += r ** numLength, 0)
  return armstrong == num
};

console.log(validate(153))

10-06 00:29