在Python中处理大数字的更有效方法?

时间:2013-03-08 18:39:07

标签: python

我在Python中有一个问题我已经为它创建了答案,但我正在努力提高答案的效率。

我不能使用函数,递归,只能使用基本的东西..

问题是:

对于3号电源2209,有1000位数字。找到12个连续数字,它的总和是最大值。

例如:5 power 36等于14551915228366851806640625。产生最大总和的12个连续数字是836685180664。

sumOfBig=0
Big=""
x=5**36
strp=str(x)
s=len(strp)
print(x)
print()
for i in range(s-11):
    new=strp[i:i+12]
    l=0
    for j in new:
        l=l+int(j)
    print(i)
    print(new)
    print(l)
    print()
    if l>sumOfBig:
        sumOfBig=l
        Big=new
print(Big)
print(sumOfBig)

你们对更好的代码有什么想法吗?

3 个答案:

答案 0 :(得分:4)

好吧,你可以有更有效的方法来总结12个连续数字。您可以跟踪12个连续数字,从子集的总和中弹出/减去最旧的(最左边的),推/添加最新的(最右边的)。

另外,sum(iterable)是一个内置函数。

我的新代码仅包含基本listfor-loop

x = 5 ** 36
num_list = [int(i) for i in str(x)]
sumOfBig = last_sum = sum(num_list[:12])
maximal_index = 0

for i, n in enumerate(num_list[12:]):
   last_sum = last_sum + n - num_list[i]
   if last_sum > sumOfBig:
      maximal_index = i+1
      sumOfBig = last_sum


print num_list[maximal_index:maximal_index+12] #[8, 3, 6, 6, 8, 5, 1, 8, 0, 6, 6, 4]

答案 1 :(得分:1)

x = 5**36
str_x = [int(i) for i in str(x)]


curBestIndex = 0
curBestSum = sum(str_x[:12])
curSum = curBestSum

for i in range(len(str_x) - 11):
    delta = str_x[i + 11] - str_x[i]
    curSum += delta
    if curSum > curBestSum:
        curBestSum = curSum
        curBestIndex = i

big = str(x)[curBestIndex : curBestIndex + 12]
print(big)
print(curBestSum)

答案 2 :(得分:0)

这是一种有助于分解11/12等所有事件的方法

MAX_LENGTH = 12
x = 5 ** 36

sequence = []
d = []

for i in str(x):
    d.append(int(i))
    if len(d) > MAX_LENGTH:
        d.pop(0)
    if sum(d) >= sum(sequence):
        sequence = list(d)

print sequence, sum(sequence)

返回值:

>>> 
[8, 3, 6, 6, 8, 5, 1, 8, 0, 6, 6, 4] 61

根据Python的Zen,“Readability Counts”,我认为这里提出的单行操作比切片操作要简单得多,特别是在考虑来自多个硬编码实例的逐个错误时序列长度。