处理大量python 2.7(运行时错误)
我必须制作一个程序,在下面的无限序列中找到第n个元素:处理大量python 2.7(运行时错误),python,algorithm,runtime,Python,Algorithm,Runtime,我必须制作一个程序,在下面的无限序列中找到第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时,我的程序会显示运行时错误,而输入可能会大到1
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+1
中,该组有k*2+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大于9的中心会发生什么情况(假设数字在base9中)?换句话说,12345678987654321
后面的顺序是什么?同样的模式:1234345678109764321非常感谢!但是你能解释一下这行吗:k=lsqrt(n-1)l?@arkang,sqrt
-是一个数字的平方根,⌊x⌋
是x
四舍五入到最接近的整数。不幸的是,此代码对某些输入(未知)不起作用。但无论如何,非常感谢你的帮助@阿康,你能给我一个问题的链接吗?也许这个序列是以零为基础的?我认为与这个问题的链接将是无用的,因为它不是以英语为基础的),但我可以肯定地告诉你,任务中没有其他内容,序列也不是以零为基础的。