我必须创建一个程序,在以下无穷无尽的序列中找到第 n 个元素:
1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1......
所以在这里你可以看到"中心"递增一个和"中心"的侧面元素相互反射,所以我们可以把这个序列分成几个小组:
[1][121][12321][1234321].....
因此,任务是在给定 n 的序列中找到第 n 个元素。例如,我们以 7 作为输入,必须返回 3,因为序列中的第 7 个元素是 3。这里的问题是,当n超过10^15
我的程序显示运行时错误,而输入可以大到10^100000
。这是我的代码:
n = int(input())
fin = n
number = long(1)
counter = long(0)
while n>0:
n = n - number
number = number+2
counter = counter + 1
mid = long((counter-1)*(2+2*(counter-1))/2+1)
place = long(counter - abs(mid-fin))
if fin==0:
print 0
else:
print place
我们有一组数字:
[1] [1 2 1] [1 2 3 2 1] ...
k
组中的总数为:
1 + 3 + 5 + ... + k*2-1
这是一个算术级数,其总和等于
(1 + k*2-1) * k / 2 = k^2
现在让我们找到序列中第 n 个数字之前的完整组k
的数量。
k = ⌊sqrt(n-1)⌋
现在我们知道我们的第 n 个数字位于具有k*2+1
元素的组号 k+1
中。让我们先丢弃k
组(它们有k^2
个数字(,现在我们需要找到索引n-k^2
的数字。它的值将等于 k+1 - |n-k^2 - (k+1)|
.对于相对较小的n
我们可以使用以下代码:
n = int(input())
k = int(math.sqrt(n-1))
print(k+1 - abs(n-k*k - (k+1)))
但是看到n <= 10^5000000
约束我们不能简单地使用math.sqrt
,我们需要其他方法来找到大整数的平方根。这个SO问题可能会有所帮助。