JavaScript实现Narcissistic Number判断代码出错,求纠错与指导
关于自恋数(Armstrong Number)的JavaScript代码问题
自恋数(又称Armstrong Number)是指一个正整数,等于其各位数字在十进制下,每个数字的位数次幂之和。
例如,153(3位数字)是自恋数:1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153而1652(4位数字)不是:
1^4 + 6^4 + 5^4 + 2^4 = 1 + 1296 + 625 + 16 = 1938挑战要求:代码需根据给定数字是否为十进制下的自恋数,返回布尔值
true或false(不是字符串)。
我刚接触JavaScript编程,写了一段自认为逻辑合理的代码,能通过部分测试,但显然存在问题,希望有人指出问题所在,帮助我理解此类问题的正确解法。
我的代码如下:
function narcissistic(value) { if (value != Number(value)) { return "Please enter a number!" } else { let counter = 0; let digits = []; for (let i = 0; i < value.length; i++) { if (value[i] === 0) { value.splice[i, 1]; counter += 1; digits.push(i); } } if (value == digits ** value.length) { return true; } else { return false; } } return false; }
你的代码存在的核心问题:
- 数字类型误用
length属性:value是数字类型,数字本身没有length属性,value.length会返回undefined,导致循环根本不会执行。 - 错误处理不符合题目要求:题目明确要求返回布尔值,你却返回了字符串提示,这会直接导致测试用例失败;且题目默认输入为数字,无需额外处理非法输入。
- 逻辑完全偏离自恋数计算规则:你试图删除0、存储循环索引的逻辑和自恋数的计算无关,
digits ** value.length既不是各位数字的幂运算,也没有求和,完全不符合需求。 - 方法调用错误:
splice是数组方法,调用格式应为arr.splice(i,1),但你写成了value.splice[i,1],且value是数字不是数组,这行代码完全无效。
正确解法思路:
- 将数字转为字符串,获取每一位字符,同时记录数字的位数。
- 遍历每一位字符,转为数值后计算其位数次幂,累加所有结果。
- 比较累加结果与原数字是否相等,返回对应的布尔值。
示例代码:
function narcissistic(value) { const numStr = value.toString(); const digitCount = numStr.length; const total = numStr.split('').reduce((sum, digit) => { return sum + Math.pow(parseInt(digit), digitCount); }, 0); return total === value; }
代码解释:
value.toString():把数字转为字符串,方便拆分每一位并获取长度。numStr.split(''):将字符串拆分为单个字符的数组,比如"153"会变成["1","5","3"]。reduce方法:遍历数组累加每一位数字的幂运算结果,Math.pow(parseInt(digit), digitCount)实现“数字的位数次幂”计算。- 最后直接比较累加和与原数字,返回布尔值。
内容的提问来源于stack exchange,提问作者Phrogsss
相关产品推荐
相关产品推荐

