项目Euler#7 Python

时间:2014-08-28 18:11:38

标签: python primes

我的代码出现问题。问题是:

"通过列出前六个素数:2,3,5,7,11和13,我们可以看到第6个素数是13.什么是10 001个素数?& #34;

这就是它的样子:

div = 10001
i = 2
count = 0
prime = 0
now = []

while count < div:

    for x in range (2,i+1):
        if len(now) ==2:
            break
        elif i%x == 0:
            now.append(x)

    if len(now)==1:
        prime = i
        count += 1
    now = []
    i+=1       



print(prime)

我已尝试div达到1000并且它似乎工作正常(对于div 1000我收到7919)。但是,当我尝试div = 10001时,我什么都没得到,甚至没有错误。如果有人会帮助我,我会非常感激。 谢谢。

4 个答案:

答案 0 :(得分:2)

# 7 10001st prime

import itertools


def is_prime(n):
    for i in range(2, n//2 + 1):
        if n % i == 0:
            return False
        else:
            continue
    return True


p = 0
for x in itertools.count(1):
    if is_prime(x):
        if p == 10001:
            print(x)
            break
        p += 1

答案 1 :(得分:1)

试试这段代码:

prime_list = lambda x:[i for i in xrange(2, x+1) if all([i%x for x in xrange(2, int(i**0.5+1))])][10000]
print prime_list(120000)

Python中的Lambda定义了一个匿名函数,xrange类似于range,定义了一个整数范围。代码使用列表理解并经过两次数字直到最终数字的平方根(因此i ** 0.5)。如果它是范围计数中的数字的倍数,则每个数字都被消除。您将按顺序留下素数列表。所以,你只需要用正确的索引打印出数字。

答案 2 :(得分:0)

只需对代码进行一些简单的修改(和简化),就可以在1/3秒内计算出所需的数字。首先,我们只检查@Hashman建议的平方根。接下来,我们仅测试并除以奇数,在前面将2作为特殊情况进行处理。最后,我们将整个now数组长度逻辑扔掉,而只是利用Python的break逻辑:

limit = 10001
i = 3
count = 1
prime = 2

while count < limit:

    for x in range(3, int(i ** 0.5) + 1, 2):
        if i % x == 0:
            break
    else:  # no break
        prime = i
        count += 1

    i += 2

print(prime)

和以前一样,这给我们提供了7919个限制(1000个限制),给了我们104743个(限制为10001个)。但这仍然不及筛子快。

答案 3 :(得分:-1)

m=0

n=None

s=1

while s<=10001:

        for i in range(1,m):

            if m%i==0:n=i

        if n==1:print(m,'is prime',s);s+=1

        m+=1