代码之家  ›  专栏  ›  技术社区  ›  dragi

在javascript中对一个范围内的每个元素求和

  •  3
  • dragi  · 技术社区  · 7 年前

    我正在尝试使我的小函数工作,它将一个范围内的每个数字相加。

    例如,当我调用如下方法时: sumAll(3,10) 应该做的 3+4+5+6+7+8+9+10

    如果我给函数赋正整数,它就会工作,但是如果它接收到一个负数、一个字符串或一个数组,它就不能正常工作。如果提供的参数不是正整数,我只想返回“错误”。

    我能帮忙吗?有更优雅(更好)的方法吗?

    我的代码:

    const sumAll = (...args) => {
        let max = Math.max(...args);
        let min = Math.min(...args);
    
        if ((min < 0) || (!Number.isInteger(min)) || (!Number.isInteger(max)) || (Array.isArray(...args))) {
            return "ERROR";
        }
    
        let n = (max - min) + 1;
    
        return ((max + min) * n) / 2;
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Nina Scholz    7 年前

    你可以用高斯公式从1…n并减去子计数。

    如果可能的话,为了只得到一个结果,可以添加一个正整数检查。

    const
        isPositiveInt = v => Number.isInteger(v) && v > 0,
        sumN = n => n * (n + 1) / 2,
        range = (m, n) => isPositiveInt(m) && isPositiveInt(n)
            ? sumN(Math.max(m, n)) - sumN(Math.min(m, n) - 1)
            : 'ERROR';
    
    console.log(range(3, 10));
    console.log(range(10, 3));
    console.log(range());
    console.log(range(3));
    console.log(range('', 10));
    console.log(range(0.2, 0.3));