所以我有这个问题,我要读取一组整数,直到输入-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个数字并读取下一个数字。但我不明白的是如何阅读以前的数字,并确定它是总和或如何计算出最长的数字序列。
答案 0 :(得分:1)
除n
之外,当前的数字还有两个变量:
previous1
,前一个值n
,previous2
,previous1
之前的值。很明显,如何将当前值与前两个值的总和进行比较。当您需要输入新号码时,请执行
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)