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