作业:永不结束循环5 ** 200000

时间:2013-10-31 19:34:12

标签: python performance loops for-loop python-3.x

我做了一项家庭作业:在5 ** 200,000的数字中找到50,000个连续数字的最大总和。 我知道如果我对这个数字进行for循环,它将不会在可行的时间内结束。 我试图将这个数字放在一个列表中并遍历列表,我不明白它是如何工作的?为什么它不像第一种情况那样?是什么让它更快? 这是我的代码:

def maxdigits(number,digits):
    s=str(number) #conversting the number to a string
    l = [int(char) for char in s]
    maximum = current = sum(l[:digits])
    for i in range(0,len(l)-digits):
        current = current-l[i]+l[i+digits]
        if current > maximum: maximum = current
    return maximum    

2 个答案:

答案 0 :(得分:2)

我想你在问为什么数字5**200000的数字上的循环很快完成,而循环遍历0(5**200000)-1范围内的所有数字包括很长一段时间。

我认为这对你来说并不明显的唯一原因是因为这些是难以记录的大数字。再考虑一下。循环遍历1000000的七位数,或从0999999的百万位数字会更快吗? 139795中有5**200000个数字。做一个简单的循环139795次并不是一件大事。做一个简单的循环5**200000次是一项庞大的工作量。这是一个荒谬的数字。如果宇宙中的每个原子都是一台计算机而且每一个原子都在宇宙的一生中运行,我怀疑他们会在5**200000次做任何事情都能成功。

答案 1 :(得分:1)

代码运行得更快,因为而不是遍历列表

[ 0, 1, ..., 5 ** 200000 ]

你正在迭代

[ 0, 1, ..., 139 795 - 50000 ]

比第一个列表小几个数量级。

计算该数字中的位数的方式是:

200000 * log5 + 1