如何获得将1中的所有数字加到给定数字的逆运算?

时间:2019-12-17 15:08:56

标签: javascript math formula

我不确定如何问这个问题。我将尽力解释我要做什么:

首先,我将所有从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

我觉得可能有一个简单的公式可以解决这个问题,但是我似乎无法弄清楚。我已经尝试过尝试和错误解决方案,但无济于事,我觉得这也是一个不好的解决方案。

任何帮助,建议或改进都将受到赞赏。谢谢。

1 个答案:

答案 0 :(得分:2)

首先,您可以将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:

     

formula

     

首先,让我们将其写入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