[英]Printing prime numbers in range
k=int(input())
res=[2]
for i in range(2,k+1):
if i%2==0:
continue
else:
for j in range(2,i):
if i%j==0 or j%2==0 :
break
else:
res.append(i)
print(res)
此代码用于在给定的数字范围内查找素数。 我试图运行代码,但列表只有第 2 个。谁能告诉我发生了什么? 如果我删除j%2==0
它正在工作。 我只想知道我的错误。
您应该使用当前的结果来加速您的过程。 您只需要测试素数的整除性。 但是你正在建立一个质数列表。 所以使用它!
k=int(input())
primes=[]
for i in range(2,k+1):
if all(i%p!=0 for p in primes):
primes.append(i)
您还可以通过仅选择不如其他人建议的 sqrt(i) 的素数元素来改进。
import math
k=int(input())
primes=[]
for i in range(2,k+1):
j=math.sqrt(i)
if all(i%p!=0 for p in primes if p<=j):
primes.append(i)
在您的内部循环j
变量从值 2 开始,然后您有一个 if 语句始终为True
因为j%2==0
始终为2%2==0
始终为True
,因此您总是从第一步break
内部for
循环迭代
您可以使用:
import math
k=int(input())
res=[]
for i in range(2, k+1):
for x in range(2, int(math.sqrt(i) + 1)):
if i % x == 0 :
break
else:
res.append(i)
# k = 20
输出:
[2, 3, 5, 7, 11, 13, 17, 19]
为了有效地生成素数,您可以使用埃拉托色尼筛法:
# Sieve of Eratosthenes
# Code by David Eppstein, UC Irvine, 28 Feb 2002
# http://code.activestate.com/recipes/117119/
def _gen_primes():
""" Generate an infinite sequence of prime numbers.
"""
# Maps composites to primes witnessing their compositeness.
# This is memory efficient, as the sieve is not "run forward"
# indefinitely, but only as long as required by the current
# number being tested.
#
D = {}
# The running integer that's checked for primeness
q = 2
while True:
if q not in D:
# q is a new prime.
# Yield it and mark its first multiple that isn't
# already marked in previous iterations
#
yield q
D[q * q] = [q]
else:
# q is composite. D[q] is the list of primes that
# divide it. Since we've reached q, we no longer
# need it in the map, but we'll mark the next
# multiples of its witnesses to prepare for larger
# numbers
#
for p in D[q]:
D.setdefault(p + q, []).append(p)
del D[q]
q += 1
k=int(input())
def gen_primes(k):
gp = _gen_primes()
p = next(gp)
while p < k:
yield p
p = next(gp)
res = list(gen_primes(k))
您的代码有一个问题,在内部循环中 or 条件不正确,正如@kederrac 所强调的那样。 您不需要 j%2==0 因为 j 总是从 2 开始,而i%j==0
已经涵盖了条件
k=int(input())
res=[2]
for i in range(2,k+1):
if i%2==0:
continue
else:
for j in range(2,i):
if i%j==0 :
break
else:
res.append(i)
print(res)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.