如何使用 JavaScript 找到 1 和 N 之间所有数字的总和

IT技术 javascript
2021-03-07 18:11:26

我试图找到一种方法来使用 JavaScript 计算 1 到 N 之间所有数字的总和。以下是我迄今为止尝试过的代码,但似乎不起作用。

function numberSum(N) {
  var total = 0;
    for(var i = 1; i <= N; i++){
      total += i;
    }
    return total;
}

我曾尝试在线使用 jslint 和其他验证器来检查我是否可能遗漏了某些内容,但这似乎也无法帮助我找到代码不起作用的原因。上面是否有我遗漏的东西阻止脚本执行添加?

6个回答

你的代码没问题。

把事情简单化:

var res = (n * (n+1)) / 2;

维基

@AmirPopovich +1 用于向 OP 展示更好的方法。我们不能省略包装()吗?=> n * (n + 1) / 2
2021-04-25 18:11:26
@AndrewLyndem - 也许你的函数被另一个函数或其他东西包裹了。无论如何阅读有关 javascript 范围的信息。
2021-05-01 18:11:26
@AmirPopovich,他的问题是它似乎不起作用你能不能给我一个更好的公式?但无论如何都是不错的代码
2021-05-07 18:11:26
@AJ - 我们解决了这两个问题:)
2021-05-12 18:11:26
我没有投反对票,但您可能想回答 OP 面临的实际问题。
2021-05-13 18:11:26

您的代码运行良好。你是怎么运行的?

演示:

function numberSum(N) {
  var total = 0;
    for(var i = 1; i <= N; i++){
      total += i;
    }
    return total;
}

function run(){
  val = document.getElementById("val").value;
  document.getElementById("results").innerHTML=val+": "+numberSum(val)
  }
<input id="val">
<input type="Submit" onclick="run();">
<p id="results"></p>

我知道这已经解决了,但我想发布一个我在阅读此线程后写的快速 ES6 oneliner,并为像我这样没有扎实数学背景的其他人更彻底地解释它。

const numSum = (n) => n * (n+1) / 2;

它之所以有效,是因为它使用了卡尔·弗里德里希·高斯 (Carl Friedrich Gauss) 提出数学公式(这有一个伟大的形象)。

基本上,每当您添加 n 个数字的总和时,序列中都会有对。所以高斯发现你不需要遍历每一对并将它们相加,相反你只需要添加中间对并将该总和乘以对的总数。这对编程非常有效,因为它们不会循环遍历每个数字,这在编程中会消耗您的资源。

您可以通过除以 n/2 来找到对的数量,它还为您提供中间数字,然后您只需添加 1 即可找到它的对。

假设您得到 1-100 的总和,通过应用高斯方法,您需要 50(101)=5050。50 是对数,在代码中,用n *101表示中间对的加法(50+51)或在代码中(n+1),最后除以 2 表示中间数。

function SimpleAdding(num) { 
 
  place = 1;
  i = num;
  do {place = place += i; i--}
  while (i > 1);
  return place; 
         
}

您将占位符变量设置为等于 1。您还将迭代次数设置为等于输入变量。

然后 do 循环将您的占位符变量添加到 'i',然后当它不再大于 1 时循环退出,这是正确的,因为您的占位符等于 1。

可以使用递归计算

var numberSum = (n, a = n) => n ? numberSum(n = n - 1 , a = a + n) : a