0

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

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

问题是:

对于数字 3 的幂 2209,有 1000 位。找到 12 个序列号,它的总和是最大的。

例如:5 次方 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)

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

4

3 回答 3

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]
于 2013-03-08T18:48:13.440 回答
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)
于 2013-03-08T18:55:17.697 回答
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 之禅“可读性很重要”,我认为这里介绍的单行操作比切片操作更直接,尤其是在考虑来自多个硬编码序列长度实例的错误时。

于 2013-03-08T19:10:40.043 回答