【问题标题】:How can I get the inverse of adding up all the numbers in from 1 to a given number?我怎样才能得到从 1 到给定数字的所有数字相加的倒数?
【发布时间】:2019-12-17 15:08:56
【问题描述】:

我不完全确定如何提出这个问题。我将尝试解释我正在尝试做的事情:

首先,我将把1(它永远是1)的所有数字加到一个范围内,比如10

let input = 10
let out = 0

while (input > 0) {
  out += input--
}

// 10 + 9 + 8 .... + 2 + 1 = 55
console.log(out)

我要做的是从输出55 中获取输入数字10。即,

const out = addRange(10) // 55
inverseRange(out) // 10

我觉得可能有一个简单的公式可以得到这个,但我似乎无法弄清楚。我已经尝试过反复试验的解决方案,但没有成功,我觉得这也是一个糟糕的解决方案。

感谢任何帮助、建议或改进。谢谢。

【问题讨论】:

  • 我投票结束这个问题作为题外话,因为它真的是一个数学问题(寻找一个公式)。获得公式后,我们可以帮助您将其转换为计算机程序。

标签: javascript math formula


【解决方案1】:

首先,您可以将addRange 函数简化为Carl Gauss' formula(first+last)*(last/2),因为您总是从 1 开始工作:

(x ** 2 + x) / 2

您可以使用高度简化的二次公式来获取唯一的正值(因为您永远不会有负值):

const addRange = x => (x ** 2 + x) / 2
const inverse = x => Math.sqrt(1 + 8 * x) / 2 - 0.5

console.log(addRange(10))
console.log(inverse(55))

说明

首先,让我们分解高斯公式。我们已经知道当 x = 10 时,输出为 55,所以让我们这样写,并尝试求解 x:

(x + 1) / 2 * x = 55    
(x + 1) / 2 = 55 / x    // divide by x
x + 1 = 110 / x         // multiply by 2
x = 110 / x - 1         // minus 1
x^2 = 110 - x           // multiply by x
x^2 + x = 110           // add x
x^2 + x - 110 = 0       // minus 55

现在我们得到了一个二次方程。 我们可以使用quadratic formula来查找x:

首先,让我们将其写入 JS:

(-1 * b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a)

我们可以用 ab 代替 1,它们在我们的方程中永远不会改变,因为它是负 30,我们可以将 4ac 之前的减号取反:

(-1 * 1 + Math.sqrt(Math.pow(1, 2) + (4 * 1 * c))) / (2 * 1)

简化为

(-1 + Math.sqrt(1 + (4 * c))) / 2
// or
Math.sqrt(1 + (4 * c)) / 2 - 0.5

但是请注意,在我们的等式中,我们的 55 加倍为 110,所以我们应该在我们的公式中做同样的事情 (4 -> 8):

Math.sqrt(1 + (8 * c)) / 2 - 0.5

【讨论】:

  • 谢谢,你能解释一下它是如何工作的吗?看起来很随意
  • @Nuggets:即使没有数学(就像你对addRange 的解决方案),这也可以通过同样的方式完成:const inverseRange = x => { let c = 0, steps = 0; while((c += ++steps) < x); return steps; };,尽管上述方法显然更好。请阅读提供的链接,了解如何正确解决addRange 对于理解上述解决方案至关重要。
  • @Nuggets 现在添加了解释:)
  • @RaymondChen 哎呀,你是对的,我现在就编辑那些 :)
  • 我会完成平方而不是使用二次公式:x^2 + x = 2N => x^2 + x + 1/4 = 2N+1/4 => (x+1 /2)^2 = 2N+1/4 => x+1/2 = sqrt(2N+1/4) => x = sqrt(2N+1/4) - 1/2
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2018-05-17
  • 1970-01-01
  • 2011-04-11
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多