我正在HackerRank上尝试Project Euler Challenge#2,我的Python代码通过了示例测试用例,但未通过隐藏的测试用例,编译器对所有这些都显示了“错误答案”。这是挑战的链接- https://www.hackerrank.com/contests/projecteuler/challenges/euler002/problem
我犯了什么错误?
我尝试了各种输入(包括巨大的价值和许多测试用例)。当我在PyCharm编辑器中执行它们时,它给了我正确的答案。我想我已经涵盖了所有输入范围。如果没有,请告诉我。
*-jar-with-dependencies.jar
答案 0 :(得分:0)
您的print(*out,sep='\n')
中的问题。您应该循环调用print
尝试一下。所有测试都通过了
#!/bin/python3
import sys
t = int(input().strip())
for a0 in range(t):
n = int(input().strip())
if (n < 2) :
print(0)
continue
# Initialize first two even prime numbers and their sum
ef1, ef2 = 0, 2
sm = ef1 + ef2
# calculating sum of even Fibonacci value
while ef2 <= n:
# get next even value of Fibonacci sequence
ef3 = 4 * ef2 + ef1
# If we go beyond limit, we break loop
if ef3 > n:
break
# Move to next even number and update sum
ef1, ef2 = ef2, ef3
sm = sm + ef2
print(sm)
答案 1 :(得分:0)
我不确定该答案是否会对将来的读者有所帮助,但是让我们快速阅读一下代码。
让我们尝试其他输入:
3
10
11
12
对于新示例,输出也应为10
(8之后的序列中的下一个数字是13):
10
10
10
如果我们使用此输入来运行您的程序,则会得到:
10
None
None
糟糕!看起来像个虫子。无从哪里来?程序初始化时,None
填充了输出列表:out=[None]*len(n)
,因此似乎没有在输出列表中输入正确的值。
其中填充值的行:out[n.index(value)]=sf
仅对输入列表中的每个项目一次运行。问题似乎在于,具有相同输出的输入将只计算一次。
我猜您正在尝试通过一次迭代计算所有值来降低运行时复杂性,而不是为每个输入生成Fibonacci序列。太聪明了!
因此,我们注意到具有相同输出值的输入仅更新output
中的 first 值。如果我们对小于f2
的所有值怎么办?
t=int(input().rstrip())
n=[]
for i in range(t):
n.append(int(input().rstrip()))
inp=sorted(n)
f1=1
f2=2
sf=2 #sum of fibonacci
it=iter(inp)
value=next(it)
out=[None]*len(n)
maxi=max(inp)
while f2<=maxi:
f1=f1+f2
f2=f1+f2
f1=f2-f1
f2=f2-f1
while f2>value:
out[n.index(value)]=sf
try:
value=next(it)
except StopIteration:
break
if f2%2==0:
sf=sf+f2
print(*out,sep='\n')
只有两件事发生了变化,if f2>value:
现在为while f2 > value:
,并且在没有更多值的情况下,我们从pass
中break
取代了while
循环代替。看来,这可以解决第一个问题。现在的输出是我们期望的:
10
10
10
好的,让我们尝试另一个输入。请记住,在任何地方都不会说输入是唯一的。它们可能发生不止一次-如果发生,会发生什么?让我们尝试以下输入:
2
100
100
输出应该只是两次44
,对不对?使用上面的新版本,我们得到:
44
None
哦,不,另一个错误。问题似乎再次出现在更新输出的行上:out[n.index(value)]=sf
。显然,如果输入类似于[100, 100]
,则输出应为[44, 44]
,但是n.index(100)
将始终为0
。 index方法将仅返回与值匹配的第一个索引。现在我们不止一个,这将不起作用。
显然,有许多解决方案,但是让我们将答案放入名为results
的字典中,并在知道所有输出应该是什么后最后创建out
>
t=int(input().rstrip())
n=[]
for i in range(t):
n.append(int(input().rstrip()))
inp=sorted(n)
f1=1
f2=2
sf=2 #sum of fibonacci
it=iter(inp)
value=next(it)
results = {}
maxi=max(inp)
while f2<=maxi:
f1=f1+f2
f2=f1+f2
f1=f2-f1
f2=f2-f1
while f2>value:
results[value] = sf
try:
value=next(it)
except StopIteration:
break
if f2%2==0:
sf=sf+f2
out = [results[x] for x in n]
print(*out, sep='\n')
这也通过了所有HackerRank测试用例。
你是如此亲密,很好!