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

时间:2017-04-17 09:33:12

标签: python while-loop

所以我有这个问题,我要读取一组整数,直到输入-1。我需要打印最长的连续数字序列的长度,其中数字是前面2的总和。这不包括序列长度中的前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时结束循环,如何跳过前2个数字并读取下一个数字。但我不明白的是如何阅读以前的数字,并确定它是总和或如何计算出最长的数字序列。

4 个答案:

答案 0 :(得分:1)

n之外,当前的数字还有两个变量:

  • previous1,前一个值n
  • previous2previous1之前的值。

很明显,如何将当前值与前两个值的总和进行比较。当您需要输入新号码时,请执行

previous2, previous1 = previous1, n

然后输入新值n

答案 1 :(得分:1)

有多种方法可以解决这个问题。您可以在阅读时处理输入,但是将输入读入列表然后处理列表会更简单。

您可以像这样阅读输入:

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)

<强>输出

4

只是为了好玩,这是一个“单行”。

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)

这两个解决方案都应对len(a) <= 2

最后一个有点密集且难以阅读。这是一个细分:

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

答案 2 :(得分:0)

你可能会做类似下面的事情。你不需要做我所做的清单,以返回符合你标准的最长的数字,这只是我对存储的草率,以证明你可以做到这一点。

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

修正了初始计数以包括较长条纹的前两个数字,并确保在循环退出时考虑最后一个计数。

答案 3 :(得分:0)

试试这个: -

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)