3

我编写了一个函数 isprime(n),如果一个数字是素数则返回 True,否则返回 false。我能够将函数循环定义的次数;但我无法弄清楚如何迭代,直到找到 x 个素数。我觉得我对 For 和 While 循环有一个不错的理解,但是对于如何将布尔返回值集成到循环中感到困惑。这是我当前的代码和错误:

错误结果:

input:100
Traceback (most recent call last):
File "euler7.py", line 25, in <module>
primeList += 1
TypeError: 'int' object is not iterable

和代码:

def isprime(n):
    x = 2
    while x < sqrt(n):
        if n % x == 0:
            return False
        else:
            x += 1
    return True

userinput = int(raw_input('input:'))

primeList = []
primesFound = 0

while primesFound != userinput:
    i = 2
    if isprime(i):
        primeList.append(i)
        primeList += 1
        i += 1
    else:
        i += 1

编辑(包括更新和功能代码):

from math import sqrt
def isprime(n):
    x = 2
    while x < (sqrt(n) + 1):
        if n % x == 0:
            return False
        else:
            x += 1
    return True

userinput = int(raw_input('input:'))
primeList = []
primeList.append(2)

i = 2
while len(primeList) != userinput:
    if isprime(i):
        primeList.append(i)
        i += 1
    else:
        i += 1

print 'result:', primeList[-1]
4

5 回答 5

2

这一行:

primeList += 1

应该:

primesFound += 1
于 2013-05-10T02:25:50.250 回答
2

您不能将 and 添加int到 python list。你应该这样做primesFound += 1以达到你想要的结果。

另外,你的isprime功能是错误的。它将返回True9。你应该while x < sqrt(n) + 1为你的函数while循环做。isprime

所以你应该有:

def isprime(n):
    x=2
    while x < sqrt(n) +1:
        if n % x == 0:
            return False
        else:
            x += 1
    return True
于 2013-05-10T02:27:15.783 回答
1

正如其他人指出的那样:

  • 你应该增加primesFound,而不是primeList
  • isprime()函数有一个错误 - 并返回True9。你需要sqrt(n) + 1.

此外:

  • 您需要在循环i外初始化;while否则,您只需建立一个 2 列表。
  • 没有必要primesFound。只是检查len(primeList)

还有我最讨厌的:

  • 命令行程序仅在特殊情况下才应诉诸交互式用户输入。在可能的情况下,将参数作为命令行参数或选项。例如:userinput = int(sys.argv[1])
于 2013-05-10T02:50:45.060 回答
1

要获得n满足某些条件的数字,您可以使用itertools.islice()函数和生成器表达式:

from itertools import count, islice

n = int(raw_input('number of primes:'))
primes = list(islice((p for p in count(2) if isprime(p)), n))

where(p for p in count(2) if isprime(p))是一个生成器表达式,它无限期地产生素数(它也可以写成itertools.ifilter(isprime, count(2)))。

您可以使用Sieve of Eratosthenes algorithm,以获得更有效的解决方案:

def primes_upto(limit):
    """Yield prime numbers less than `limit`."""
    isprime = [True] * limit
    for n in xrange(2, limit):
        if isprime[n]:
           yield n
           for m in xrange(n*n, limit, n): # mark multiples of n as composites
               isprime[m] = False

print list(primes_upto(60))
# -> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59]

请参阅在 python 中列出 N 以下所有素数的最快方法

注意:大约有limit / (log(limit) - 1)小于 的素数limit

您还可以使用无限素数生成器,例如gen_primes(), 来获取第一个n素数:

primes = list(islice(gen_primes(), n))

请参阅如何在 Python 中实现高效的无限质数生成器?

于 2013-05-10T03:18:55.433 回答
0
def is_prime(n):
    x=2
    while x < sqrt(n) +1:
        if n % x == 0:
            return False
            break
        else:
            x += 1
    return True
于 2014-12-01T13:38:59.200 回答