我编写了一个函数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]
答案 0 :(得分:2)
这一行:
primeList += 1
应该是:
primesFound += 1
答案 1 :(得分:2)
您无法将int
添加到python list
。你应该primesFound += 1
来达到你想要的结果。
另外,您的isprime
功能错误。对于9,它将返回True
。对于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
答案 2 :(得分:1)
正如其他人所指出的那样:
primesFound
,而不是primeList
。isprime()
函数有一个错误 - 并返回True
为9.您需要sqrt(n) + 1
。另外:
i
循环之外初始化while
;否则,你只需建立一个2的列表。primesFound
。只需查看len(primeList)
。我的宠儿:
userinput = int(sys.argv[1])
。答案 3 :(得分: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))
其中(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]
请参阅Fastest way to list all primes below N in python。
注意:大约limit / (log(limit) - 1)
素数小于limit
。
您还可以使用无限素数生成器(例如gen_primes()
)来获取第一个n
素数:
primes = list(islice(gen_primes(), n))
请参阅How to implement an efficient infinite generator of prime numbers in Python?
答案 4 :(得分:0)
def is_prime(n):
x=2
while x < sqrt(n) +1:
if n % x == 0:
return False
break
else:
x += 1
return True