如何对数字各位执行算术运算?JS代码输出NaN的修复方案
代码修复与通用实现方案
原代码的问题
- 硬编码索引适配性极差:代码只写死了5位和6位数字的计算逻辑,输入其他位数(如3位、7位)时会出现数组索引越界,得到
undefined后相乘直接输出NaN。 - 未处理无效输入:若用户输入非数字字符或空值,
Array.from(a).map(i => Number(i))会生成含NaN的数组,最终计算结果必然是NaN。 - 逻辑错误:偶数位分支重复计算了
(a[1] + a[a.length - 2]),不符合首尾对应相乘的需求逻辑。
修复方案与循环逻辑
核心思路
- 先做输入校验,确保输入为纯数字,避免
NaN产生。 - 用循环遍历首尾对应数字对:循环变量
i从0开始,到Math.floor(数字位数/2) - 1结束,每次取第i位和倒数第i+1位相加,将结果累乘到总乘积中。 - 若数字位数为奇数,最后单独乘上中间位数字(索引为
Math.floor(数字位数/2))。
完整代码实现
// 核心计算函数 function calculateProduct(digitCount, number) { const digits = number.toString().split('').map(Number); // 校验输入位数匹配且无无效数字 if (digits.length !== digitCount || digits.some(isNaN)) { throw new Error('输入的数字位数不匹配或包含非数字字符'); } let product = 1; const halfLength = Math.floor(digitCount / 2); // 循环处理首尾对应对 for (let i = 0; i < halfLength; i++) { const sum = digits[i] + digits[digitCount - 1 - i]; product *= sum; } // 奇数位数时乘中间位 if (digitCount % 2 !== 0) { product *= digits[halfLength]; } return product; } // 处理用户输入 const input = prompt("请输入数字:"); if (input && /^\d+$/.test(input)) { const digitCount = input.length; const number = parseInt(input, 10); try { const result = calculateProduct(digitCount, number); alert(`计算结果:${result}`); } catch (err) { alert(err.message); } } else { alert("请输入有效的纯数字!"); }
关键细节说明
- 输入校验:用正则
/^\d+$/确保输入为纯数字,函数内额外校验位数匹配,避免参数错误。 - 循环条件:
i < halfLength,其中halfLength = Math.floor(digitCount/2),比如5位数的halfLength为2,循环处理前两对首尾;6位数的halfLength为3,循环处理三对首尾。 - 中间位处理:奇数位数时,中间位索引恰好是
halfLength(如5位数的索引2对应数字3)。
内容的提问来源于stack exchange,提问作者Сергей Миронин
相关产品推荐
相关产品推荐

