Python-使用while循环读取以前的数字

Python-使用while循环读取以前的数字,python,while-loop,Python,While Loop,所以我有一个问题,在输入-1之前,我要读取一组整数。我需要打印最长连续数字序列的长度,其中一个数字是前两个数字的和。这不包括序列长度中的前2个数字 输入的数字示例和答案如下: 1,2,3,4,5,8,13,21,34,55,10,6,7,8,20,25,30,40,-1=>4 到目前为止,我所拥有的: n = int(input()) #reads the initial input numberSkip = 0 #numberSkip allows me to skip the first

所以我有一个问题,在输入-1之前,我要读取一组整数。我需要打印最长连续数字序列的长度,其中一个数字是前两个数字的和。这不包括序列长度中的前2个数字

输入的数字示例和答案如下: 1,2,3,4,5,8,13,21,34,55,10,6,7,8,20,25,30,40,-1=>4

到目前为止,我所拥有的:

n = int(input())  #reads the initial input
numberSkip = 0  #numberSkip allows me to skip the first 2 numbers

while n != -1:
    if numberSkip < 2:
        numberSkip += 1
    elif numberSkip >= 2:
        print (n)  #this is where the rest of the code would go I'm assuming 
    n = int(input())

因此,我已经研究出当循环达到-1时如何结束循环,如何跳过前两个数字并读取下一个数字。但我不明白的是如何阅读前面的数字,并计算出它是否是总和,或者如何计算出最长的数字序列。

您可以做如下操作。你不需要像我列出的那样返回符合你标准的最长运行时间的数字,只是我在存储方面做得太草率,来演示一种你可以做到这一点的方法

n = int(input('Enter Value:'))
numberSkip = 0
counter = 2
counts = []
prev_num = []

while n != -1:
    if numberSkip < 2:
        numberSkip += 1
    else:
        if n == sum(prev_num[-2:]):
            counter += 1
        else:
#             You don't need this to keep the record of them.
            counts.append(counter)
            counter = 0
    prev_num.append(n)
    n = int(input('Enter Value:'))
counts.append(counter)
print(max(counts))
修正了初始计数,以包括较长条纹的前两个数字,并确保在循环退出时考虑最后一个计数。

除了n(当前数字)外,还有两个变量:

previous1,n的前一个值, previous2,previous1之前的值。 很明显,您是如何将当前值与前两个值之和进行比较的。当您需要输入新号码时,请执行以下操作

previous2, previous1 = previous1, n
然后输入一个新的n值。

尝试以下操作:-

cnt=0
sm=0
res=0
len_of_seq=0

while True:
   n=input()

   if cnt<2:
       sm+=n
       cnt+=1

   elif cnt==2:
       if sm==n:
           if len_of_seq<=2: #not increase value of count for  first two number
               res+=1
           else:
               res+=cnt+1
       sm=0
       cnt=0

   len_of_seq+=1
   if n==-1:
       break

  print(res)

有多种方法可以实现这一点。您可以在读取输入的同时对其进行处理,但将输入读入列表然后处理列表会使事情变得更简单

您可以这样读取输入:

a = []
while True:
    n = int(input())
    if n == -1:
        break
    a.append(n)
请注意,如果读取非整数,则会引发ValueError

现在我们已经把我们的数字列在了一个列表中,我们可以按照Rory Daulton建议的方式来处理它们

a = [1, 2, 3, 4, 5, 8, 13, 21, 34, 55, 10, 6, 7, 8, 20, 25, 30, 40]

prev2, prev1, *a = a
maxlen = seqlen = 0
for n in a:
    seqlen = seqlen + 1 if n == prev1 + prev2 else 0
    maxlen = max(maxlen, seqlen)
    prev2, prev1 = prev1, n

print(maxlen)
输出

只是为了好玩,这里有一条单行线

from itertools import groupby

maxlen = max((len(list(g)) for k, g in groupby(u + v == w 
    for u,v,w in zip(a, a[1:], a[2:])) if k), default=0)

如果lena感谢这两种解决方案,那么这两种解决方案都能解决问题。除了情况1,2,3,4,5,10,15,20,8,13,21,34,55,89144,-1=>5,它返回1而不是5,并且不确定原因。在事件顺序中,我忽略了一些小事情。我已经把它们清理干净了。但是下次我建议在运行一些代码时把一些打印语句放在中间,试图找出这些类型的场景发生在哪里。当事情没有按预期进行时,您将通过这种方式学到更多。我希望您不介意我在这个答案中扩展了建议。谢谢,这很有帮助:D@PM2Ring字体不,我不介意。我没有足够的时间给出一个完整的答案,所以你能这样做是件好事。但是,我会避免存储整个序列的列表,因为它不需要并且占用内存。公平地说,不存储整个序列,我这样做只是因为它使代码稍微简单和简短。OTOH,机器的RAM往往比我们开始编码时多一点,我认为这段代码的用户不会键入千兆字节的数据尽管如此,我还是倾向于一行一行地处理文本文件,如果这样做有意义的话。试穿一下[1,2,3,5,8,1,2,3,5,8]谢谢你这么说真的很有帮助,尽管我不太理解prev2,prev1,*a=a或maxlen=seqlen=0@S.Craftmaxlen=seqlen=0仅将0分配给seqlen和maxlen。另一个有点棘手prev2,prev1,*a=a将列表a解压到元组prev2,prev1,*a中。因此,a中的第一项分配给prev2,第二项分配给prev1,其余项分配给a。因此,我们有效地切断了a的前两项,并将它们放入prev2和prev1中。序列解包的一个更简单的例子是A,b,c='abc'。您可以在中阅读更多关于它的信息。顺便说一句,Python的旧版本不支持*,有关详细信息,请参阅。
from itertools import groupby

maxlen = max((len(list(g)) for k, g in groupby(u + v == w 
    for u,v,w in zip(a, a[1:], a[2:])) if k), default=0)
from itertools import groupby

a = [1, 2, 3, 4, 5, 8, 13, 21, 34, 55, 10, 6, 7, 8, 20, 25, 30, 40]

print('tuples')
b = list(zip(a, a[1:], a[2:]))
print(b)

print('tests')
b = [u + v == w for u,v,w in b]
print(b)

print('group lengths')
b = [(k, len(list(g))) for k, g in groupby(b)]
print(b)

maxlen = max((l for k, l in b if k), default=0)
print(maxlen)
tuples
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 8), (5, 8, 13), (8, 13, 21), (13, 21, 34), (21, 34, 55), (34, 55, 10), (55, 10, 6), (10, 6, 7), (6, 7, 8), (7, 8, 20), (8, 20, 25), (20, 25, 30), (25, 30, 40)]
tests
[True, False, False, False, True, True, True, True, False, False, False, False, False, False, False, False]
group lengths
[(True, 1), (False, 3), (True, 4), (False, 8)]
4