C-在很长的系列中找到一个数字的最佳技巧是什么

时间:2014-12-29 04:48:54

标签: c math data-structures

我有以下系列,无限长。

1 2 4 7 11 16 22 29 37.....

我需要找到一个给定的数字(比方说,N)是否存在于这个系列中,或者不是。该数字可以再次输入,并且可以毫不奇怪地是 long long 值。 考虑到系列是无限的,我认为创建一个数据结构来存储元素是无关紧要的(我在这里太笨了吗?)

仔细研究这个系列,我发现连续术语之间的差异形成了算术级数。

1 2 3 4 5 6 7 8.....

因此,一种最简单的方法是继续从1开始添加它们,如果我们达到 == N ,输出是,否则如果> N ,不是。 但这将是我能想到的最昂贵的算法。 我必须错过一些非常尖锐的逻辑,但不确定。

3 个答案:

答案 0 :(得分:3)

根据这个系列,T(n) - n'系列。

T(1) = 1

T(2) - T(1) = 1

T(3) - T(2) = 2

T(4) - T(3) = 3

.

.

.

T(n) - T(n - 1) = n - 1

//sum of all above

T(n) - T(1) = 1 + 2 + 3 + 4 + 5 + ... + (n - 2) + (n - 1)

//T(1) = 1

T(n) - 1 = n(n - 1) / 2 

2 * (T(n) - 1) = n^2 - n

//T(n) is your input number and check whether n has an integer 
//solutions in following quadratic equation, if yes T(n) is in this series. 

n^2 - n - 2 * (number - 1) = 0;


simply check if the value of " (1 + sqrt((8.0 * number) - 7)) / 2.0 " is integer.

Checking if float is an integer

答案 1 :(得分:0)

无需在任何数据结构中存储该系列。 你可以使用公式:

(n * (n + 1) / 2) + 1 = x  

其中x是否。你想搜索。如果这个等式中存在任何真正的根,那么" X"退出。 例如:16

(n * (n + 1) / 2) + 1 = 16

答案 2 :(得分:0)

序列

1, 2, 4, 7, 11, 16, ...

中删除1
0, 1, 3, 6, 10, 15, ...

反过来

0, 0+1, 0+1+2, 0+1+2+3, 0+1+2+3+4, 0+1+2+3+4+5, ...

要查找序列中是否N,您只需要检查N-1是否是一系列自然数的总和,即是否存在p { {1}}。