我在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)你们对更好的代码有什么想法吗?
发布于 2013-03-09 02:48:13
那么,你可以有更有效的方法来对这12个序列号求和。您可以跟踪12个序列号,从子集的和中弹出/减去最旧(最左边)的数字,推入/添加最新(最右边)的数字。
此外,sum(iterable)是一个内置函数。
我的新代码只有基本的list和for-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-09 02:55:18
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-09 03:10:40
这里有一个方法,可以帮助排除所有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,“可读性很重要”,我认为这里给出的单行操作比切片操作要简单得多,特别是当考虑到来自多个硬编码序列长度的实例的off-by-one错误时。
https://stackoverflow.com/questions/15300995
复制相似问题