处理大数字python 2.7(运行时错误)

时间:2018-01-03 12:21:52

标签: python algorithm runtime

我必须创建一个程序,在以下无限序列中找到第n个元素:

 ScanOperationConfig config = new ScanOperationConfig
 {
   AttributesToGet = new List<string> { "Subject", "Message" } ,
   Filter = scanFilter
   Select = SelectValues.SpecificAttributes
 };

所以在这里你可以看到'center'加1,'center'的副元素相互反映,所以我们可以将这个序列分成小组:

1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1......

所以任务是找到给定n的序列中的第n个元素。例如,我们将7作为输入并且必须返回3,因为序列中的第7个元素是3.这里的问题是当n超过[1][121][12321][1234321]..... 时,我的程序显示运行时错误,而输入可能与{{{{1}一样大。 1}}。这是我的代码:

10^15

1 个答案:

答案 0 :(得分:7)

我们有数组:

[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 <= 10^5000000约束我们不能简单地使用math.sqrt,我们需要其他方法来查找大整数的平方根。这SO question可能会有所帮助。