我正在尝试查找所有大于2且小于501的质数。请参阅下面的代码:
num = 501
x = int(input('Enter a number greater than 1: '))
if x > 1:
for i in range(2, num):
if x % i == 0:
result = False
else:
result = True
if result == True:
print('Prime number.')
else:
print('Not a prime number.')
else:
print('Not a prime number.')
我尝试对两个数字分别为19和99的代码运行。当我在下面给出的代码后放置“ break语句”时,得到的结果为“ 99:不是素数”,而是“ 19,即一个素印为非素”,反之亦然。
if x % i == 0:
result = False
break
请更正上面的代码以打印正确的输出。
答案 0 :(得分:0)
如果我没记错的话,对于501以下的所有数字,它总是返回false,因为任何输入的数字都可以被自己整除。 您还应该检查x!= i。
答案 1 :(得分:0)
这将起作用:
import math # This will import math module
def isprime(x):
if x > 1:
result = True
for i in range(2, int(math.sqrt(x))+1 ):
if ( x % i == 0):
result = False
break
if ( result == True):
print("Prime Number ")
else:
print("Not a Prime Number")
并执行如下函数调用:
isprime(19)
答案 2 :(得分:0)
使用两千多年前的希腊数学家发明的Eratosthenes筛子比使用试验除法要快得多:
def primes(n): # sieve of eratosthenes
i, p, ps, m = 0, 3, [2], n // 2
sieve = [True] * m
while p <= n:
if sieve[i]:
ps.append(p)
for j in range((p*p-3)/2, m, p):
sieve[j] = False
i, p = i+1, p+2
return ps
此函数返回一个小于 n 的质数列表,仅对奇数进行筛选,并分别处理2。如果您希望生成素数而不是返回列表,请使用以下命令:
def primegen(start=0): # stackoverflow.com/a/20660551
if start <= 2: yield 2 # prime (!) the pump
if start <= 3: yield 3 # prime (!) the pump
ps = primegen() # sieving primes
p = next(ps) and next(ps) # first sieving prime
q = p * p; D = {} # initialization
def add(m, s): # insert multiple/stride
while m in D: m += s # find unused multiple
D[m] = s # save multiple/stride
while q <= start: # initialize multiples
x = (start // p) * p # first multiple of p
if x < start: x += p # must be >= start
if x % 2 == 0: x += p # ... and must be odd
add(x, p+p) # insert in sieve
p = next(ps) # next sieving prime
q = p * p # ... and its square
c = max(start-2, 3) # first prime candidate
if c % 2 == 0: c += 1 # candidate must be odd
while True: # infinite list
c += 2 # next odd candidate
if c in D: # c is composite
s = D.pop(c) # fetch stride
add(c+s, s) # add next multiple
elif c < q: yield c # c is prime; yield it
else: # (c == q) # add p to sieve
add(c+p+p, p+p) # insert in sieve
p = next(ps) # next sieving prime
q = p * p # ... and its square
my blog上的素数更多。
答案 3 :(得分:0)
请更正上面的代码以打印正确的输出。
我相信以下是您代码的简化版本和更正版本:
number = int(input('Enter a number greater than 1: '))
if number > 1:
for divisor in range(2, int(number ** 0.5) + 1):
if number % divisor == 0:
print('Not a prime number.')
break
else: # no break
print('Prime number.')
else:
print('Not a prime number.')
此代码有效,但不是最佳的。一种简单的优化方法是将2 /偶数作为特殊情况处理,并且仅将3以后的奇数除以。一个重要的优化方法是按照@ user448810的建议切换到筛分方法。
您提供的代码每个用户输入仅测试一个数字。如果您要将其转换为测试数字范围的循环,例如说所有大于2但小于501的数字,则可以执行以下操作:
for number in range(3, 501):
if number > 1:
for divisor in range(2, int(number ** 0.5) + 1):
if number % divisor == 0:
print(number, 'is not a prime number.')
break
else: # no break
print(number, 'is a prime number.')
else:
print(number, 'is not a prime number.')