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

2024-04-27 22:05:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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)

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


Tags: 函数答案innewfor数字效率序列号
3条回答

这里有一个方法可以帮助你把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)

退货:

^{pr2}$

根据Python的Zen,“可读性很重要”,我认为这里介绍的单行操作比切片操作简单得多,尤其是当考虑到来自多个硬编码序列长度实例的错误时。在

好吧,你可以用更有效的方法来求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]
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)

相关问题 更多 >