我不确定如何问这个问题。我将尽力解释我要做什么:
首先,我将所有从1
(始终为1
)到一个范围,例如10
的数字加起来:
let input = 10
let out = 0
while (input > 0) {
out += input--
}
// 10 + 9 + 8 .... + 2 + 1 = 55
console.log(out)
我想做的是从输出10
中取回输入数字55
。即
const out = addRange(10) // 55
inverseRange(out) // 10
我觉得可能有一个简单的公式可以解决这个问题,但是我似乎无法弄清楚。我已经尝试过尝试和错误解决方案,但无济于事,我觉得这也是一个不好的解决方案。
任何帮助,建议或改进都将受到赞赏。谢谢。
答案 0 :(得分:2)
首先,您可以将addRange
函数简化为Carl Gauss' formula,(first+last)*(last/2)
,因为您总是从1开始工作,所以可以简化为{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)
我们可以用
a
和b
代替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