如果我知道1 + 2 + 3 + .. + n = n *(n + 1)/ 2的结果,如何得到n?

时间:2017-01-29 13:23:11

标签: c++ c algorithm

如果您知道1+2+3+..+n的结果,n*(n+1)/2 例如,如果结果为5050,那么我可以知道n100。我怎样才能获得n。但是,您只能通过添加减法来计算n

而且我知道如何获得n i我可以通过计算每个1+2+3+...+n1,{{1}来计算从1到n的自然数}},1+2,... 1+2+3,然后我可以将每个结果检查到1+2+..+n,然后我就会发现5050n。但我发现计算步骤将超过2000步,所以有一个很好的算法来查找100
谢谢!

3 个答案:

答案 0 :(得分:3)

请注意:

1 + 2 + ... + N = V = N(N+1)/2

可以改写为:

N^2 + N - 2V = 0

您正在寻找的价值是:

(-1+sqrt(1+4*2*value))/2;

这是给定二次方程的零点之一。

在C ++中,您可以使用如下函数:

int rev(int value) {
    return (-1+std::sqrt(1+4*2*value))/2;
}

答案 1 :(得分:2)

仅限添加减法 ... 只需添加1中的数字并检查总和是否为给定数字。

在伪代码中。 给定5050.

number := 5050
next, sum := 0
while sum <= number
  next := next + 1
  sum := sum + next
return next

答案 2 :(得分:0)

假设1 + 2 + .. + n = n*(n+1)/2 = r([{1}}已知r且未知)。

现在我们想知道满足上述等式的n的正值。

理论方法

我们有,            n            n^2+n=2*r            => (n+1/2)^2 = 2*r + 1/4(仅=> n + 1/2 = sqrt(2*r+1/4)以后的+ve sqrt)            n>0 例如,=> n = sqrt(2*r+1/4) - 1/2,可以通过插入r=55 => n =10的值在O(1)时间内找到。

数值方法

现在,我们也可以通过找到方程r的正根来数字化地解决这个问题。如果(n^2+n)/2-r=0,二次方程的图形如下所示,则可以使用r=55bisection数值方法以数字方式找出根。以下二次多项式图表显示newton-raphson的{​​{1}}。

enter image description here