我正在尝试用Javascript写一个函数,该函数将根据数字是否为Armstrong数字返回true
或false
。阿姆斯特朗(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
已经产生了true
或false
无需在每次迭代中调用
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))