Python:找到+ 100的素数

时间:2013-12-30 10:49:51

标签: python numbers primes

我的程序有一个奇怪的问题。 当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()
你能帮助我吗?

2 个答案:

答案 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()