【问题标题】:How to get the n if I know the result of 1+2+3+..+n=n*(n+1)/2? [duplicate]如果我知道 1+2+3+..+n=n*(n+1)/2 的结果,如何得到 n? [复制]
【发布时间】:2017-01-29 13:23:11
【问题描述】:

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

我知道如何获得n i 是我可以通过计算每个不同的1+2+3+...+n 来遍历从1 到n 的自然数,例如11+21+2+3。 ..1+2+..+n,然后我可以检查每个结果到5050,然后我可以找到n100。但是我发现计算步骤会超过 2000 步,所以有一个很好的算法可以找到n
谢谢!。

【问题讨论】:

  • 从 1 到 100 的数字相加应该只需要 100 步,而不是 2000 步。
  • 编辑你的标签并添加什么样的编程语言
  • @melpomene,不是从 1 到 100,而是从 1 到 2,然后从 1 到 3,直到 1 到 100,然后你才能找到正确的 n。
  • @zhenguoli 为什么每次都从1重启?如果您刚刚计算了 1+2+...+n,则只需将 n+1 添加到之前的结果即可得到 1+2+...+n+(n+1)。
  • 为什么不简单地求解二次方程?

标签: c++ c algorithm


【解决方案1】:

注意:

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;
}

【讨论】:

  • "但是,只能通过加减法计算n。"
【解决方案2】:

只能通过加法减法... 只需从 1 开始相加,然后检查总和是否为给定的数字。

在伪代码中。 给定5050。

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

【讨论】:

  • 谢谢,这就是我想要的。
  • 您应该将循环中的条件更改为while sum &lt;= number。否则,如果 number 不是 1 + 2 + ... + n 的形式,此代码将产生无限循环。
  • @Paul,是的。已编辑,但我只关心算法对于允许的输入 number 是否正确。
【解决方案3】:

假设1 + 2 + .. + n = n*(n+1)/2 = rr 已知 n 并且未知)。

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

理论方法

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

数值方法

现在,我们也可以通过找到方程(n^2+n)/2-r=0 的正根来计算数值解。如果r=55,二次方程的图形如下所示,可以使用bisectionnewton-raphson类似的数值方法来数值求根。二次多项式的下图显示n=10 对应于r=55

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 2011-01-29
    • 2016-08-07
    • 2012-09-19
    • 1970-01-01
    • 2015-10-08
    • 2022-06-17
    • 2012-03-21
    相关资源
    最近更新 更多