我在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)
你们对更好的代码有什么想法吗?
答案 0 :(得分:4)
好吧,你可以有更有效的方法来总结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]
答案 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”,我认为这里提出的单行操作比切片操作要简单得多,特别是在考虑来自多个硬编码实例的逐个错误时序列长度。