Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大数N个连续数字之和_Python_Algorithm_Numbers_Sum_Largenumber - Fatal编程技术网

Python 大数N个连续数字之和

Python 大数N个连续数字之和,python,algorithm,numbers,sum,largenumber,Python,Algorithm,Numbers,Sum,Largenumber,我需要得到一个大数字范围内的n连续数字的最大和 例如,范围可能是5^150000,在此范围内,我想找出50000个连续数字的最大和 我使用两个循环的方法似乎永远不会终止。如有任何意见,我将不胜感激 守则: count = 0 tempsum = 0 summ = 0 # variables init oldlist = '' newlist = '' num = str(3**2209) # for example for digit in num: # go

我需要得到一个大数字范围内的
n
连续数字的最大和

例如,范围可能是
5^150000
,在此范围内,我想找出50000个连续数字的最大和

我使用两个循环的方法似乎永远不会终止。如有任何意见,我将不胜感激

守则:

count = 0
tempsum = 0
summ = 0                 # variables init
oldlist = ''
newlist = ''
num = str(3**2209) # for example

for digit in num: # go over all the digits in the number
    while count < 12 and len(num) >= 12 : # check in 12-digits blocks while possible
        oldlist += num[count] # update old list with new digit
        tempsum += int(num[count]) # add current digit to sum
        count += 1

    if tempsum > summ: # check if new sum is larger than old one
        summ = tempsum # update sum
        newlist = oldlist # update the sequence list
    oldlist = ''
    count = 0
    tempsum = 0
    num = num[1:] # slice the 'first' digit of the number

print(newlist, summ) # print sequence and desired sum
count=0
tempsum=0
summ=0#变量init
oldlist=''
新列表=“”
num=str(3**2209)#例如
对于num中的数字:#检查数字中的所有数字
当计数<12且len(num)>=12时:#尽可能检入12位数字块
oldlist+=num[count]#用新数字更新旧列表
tempsum+=int(num[count])#将当前数字加到总和上
计数+=1
如果tempsum>sum:#检查新和是否大于旧和
sum=tempsum#更新sum
newlist=oldlist#更新序列列表
oldlist=''
计数=0
tempsum=0
num=num[1:]#将数字的“第一个”数字切片
打印(新列表、总和)#打印顺序和所需总和

您不需要两个循环

首先,让我们将所有数字放入列表中:

>>> a = list(map(int, str(5**150000)))
然后计算前50000位数字的总和:

>>> maximum = current = sum(a[:50000])
>>> current
225318
现在,让我们在列表中循环,从总和中删除最低的数字,并在每次迭代中向前添加下一个50000位数:

>>> for i in range(0, len(a)-50000):
...     current = current - a[i] + a[i+50000]
检查新金额是否大于上一个金额,如果大于,则将其作为新的“临时最大值”:

一旦循环退出,
max
包含最大值:

>>> maximum
225621
让我们将其全部放在一个函数中,这样就不会出现复制错误:

def maxdigitsum(number, digits):
    l = list(map(int, str(number)))
    maximum = current = sum(l[:digits])
    for i in range(0, len(l)-digits):
        current = current - l[i] + l[i+digits]
        if current > maximum: maximum = current
    return maximum

请给我们看看你的代码。重复:至少,它是基于相同的数学问题。我不明白为什么这是关闭的
太本地化了
。另一个被关闭,因为
不是真正的问题
。我认为这两种方法都很通用,对以后的SO-ER很有用。你可以检查你留下的数字是否比你得到的新数字小或大,而不是每一步都求和。如果较大,则计算新的最大值,否则只需移动on@elssar:这将丢弃我删除的数字的信息,使最终计算不正确。我认为您需要执行
new=new-a[I]+a[I+50000]
,否则您将得到一个不完全连续的数字总和。您是对的,而@ThijsvanDien解决了这个问题。我重命名了变量以使其更有意义,并更正了逻辑。抱歉。@user2204926好吧,那么您没有针对这种情况正确地复制或修改它。代码对我来说很好(输出61)。一些更具描述性的变量名不会有什么坏处。您真的需要至少为代码提供最少的注释。(即使根据上述情况,它们只是微不足道的案例。)
>>> maximum
225621
def maxdigitsum(number, digits):
    l = list(map(int, str(number)))
    maximum = current = sum(l[:digits])
    for i in range(0, len(l)-digits):
        current = current - l[i] + l[i+digits]
        if current > maximum: maximum = current
    return maximum