我的程序有一个奇怪的问题。 当n <= 100时,它工作得很好。 然而,当涉及到更大的数字(例如n = 121)时,它会不断向我显示这条消息:
File "my_code.py2", line 24, in
print k[int(n)]
IndexError: list index out of range
代码:
k=[]
z=[]
a=0
k.append(1)
k.append(2)
k.append(3)
n=raw_input()
while n!="END" and int(n)>0 and int(n)%100000==int(n):
for x in xrange(3,7919,2):
for i in xrange(3,x,2):
if x%i!=0:
a=1
else:
a=0
break
if a==1:
k.append(x)
if len(k)==int(n):
break
print k[int(n)]
n=raw_input()
你能帮助我吗?
答案 0 :(得分:3)
我认为你有一个错误的错误。 Python使用零基索引,因此要获得第121个元素,您需要在k[120]
访问您的列表。
顺便说一下,1不是素数。
编辑:我可以建议更好的算法,而不是修复您在评论中提到的代码的其他问题吗? sieve of eratosthenes不是检查除数,而是列出边界下所有素数的常用方法。它易于实现,并且应该比使用嵌套循环的当前方法更快。
答案 1 :(得分:1)
这是因为您在len(k) == int(n)
时打破了循环,然后访问k[int(n)]
。由于python使用基于0
的索引,当列表长度等于n
时,您可以访问的最后一个索引是n-1
。
当您向列表中添加1并且1不是素数时,列表中的每个其他素数都将具有其实际索引。
I.e 2在索引1处,2是第一个素数。 3是在索引2处,3是第二个素数。
因此,解决方案是将len(k) == int(n)
更改为len(k) == int(n) + 1
。
注意:您的程序还有另一个问题。什么时候外部循环中的语句被执行。它不断地向k
添加元素。所以,我建议首先计算所有素数达到一定限度。然后只查询该列表。不要从头开始重复计算所有素数。
k=[]
z=[]
a=0
k.append(1)
k.append(2)
k.append(3)
for x in xrange(3,7919,2):
for i in xrange(3,x,2):
if x%i!=0:
a=1
else:
a=0
break
if a==1:
k.append(x)
n = raw_input()
while n!="END" and int(n)>0 and int(n) < len(k):
print k[int(n)]
n = raw_input()