You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对数字各位执行算术运算?JS代码输出NaN的修复方案

代码修复与通用实现方案

原代码的问题

  1. 硬编码索引适配性极差:代码只写死了5位和6位数字的计算逻辑,输入其他位数(如3位、7位)时会出现数组索引越界,得到undefined后相乘直接输出NaN。
  2. 未处理无效输入:若用户输入非数字字符或空值,Array.from(a).map(i => Number(i))会生成含NaN的数组,最终计算结果必然是NaN。
  3. 逻辑错误:偶数位分支重复计算了(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,提问作者Сергей Миронин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:15:32