如果您知道1+2+3+..+n
的结果,n*(n+1)/2
例如,如果结果为5050
,那么我可以知道n
是100
。我怎样才能获得n
。但是,您只能通过添加和减法来计算n
。
而且我知道如何获得n
i我可以通过计算每个1+2+3+...+n
,1
,{{1}来计算从1到n的自然数}},1+2
,... 1+2+3
,然后我可以将每个结果检查到1+2+..+n
,然后我就会发现5050
是n
。但我发现计算步骤将超过2000步,所以有一个很好的算法来查找100
?
谢谢!
答案 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=55
或bisection
数值方法以数字方式找出根。以下二次多项式图表显示newton-raphson
的{{1}}。