在python中打印素数
Posted
技术标签:
【中文标题】在python中打印素数【英文标题】:Printing prime number in python 【发布时间】:2018-11-27 01:31:04 【问题描述】:我正在尝试在 python 中打印 3-50 范围内的素数。代码如下:
for i in range(3,51):
flag=0
for j in range(3,i):
if(i%j==0):
flag=1
if(flag==0):
print(i)
代码运行正常,除了 THAT IS ALSO PRINTING 4. 请告知代码逻辑是否有问题(忽略效率问题)。
【问题讨论】:
对于i=4
,您在(2,2)
范围内运行j
,这是一个空范围。如果你把端点加一,你会发现一个因数。
按照@khelwood 的建议,将for j in range(2,int(i/2))
行更改为for j in range(2,int(i/2)+1)
它应该可以工作
请检查编辑后的版本,它仍然给我 4 作为输出
我说增加端点。我没有说增加起点。如果你从 3 开始你的范围,你仍然错过了 2。
如果我从 3 开始 j 有什么问题?请参考之前错误发布的代码编辑版本...
【参考方案1】:
print(2)
for i in range(3,51):
flag=0
for j in range(2,int(i/2)):
if(i%j==0):
flag=1
if(flag==0):
print(i)
当 i = 4 时,范围将是 range(2,2),即 0。它不会进入 if(i%j == 0): 块。因此,当 i = 4 时,您的标志始终为 0。
解决它的一种方法是添加一个检查 i 是否为 4。
if(flag==0 and i != 4):
编辑:正如其他人评论的那样,将范围增加 1 比检查值是否为 4 更好。
for j in range(2,int(i/2)+1)
【讨论】:
【参考方案2】:将range(3,i)
更改为range(2,i)
,因为如果我们使用range(3,i)
,则不检查4 除以2。因此,4 作为质数返回。
for i in range(3,51):
flag=0
for j in range(2,i):
if(i%j==0):
flag=1
if(flag==0):
print(i)
但是,更结构化和更有效的方法是使用以下内容:-
def isPrime(num):
for i in range(2,num/2+1):
if (num%i==0):
return False
return True
for i in range(3,51):
if isPrime(i):
print i
我们不需要检查所有数字的除法,直到数字本身是否为素数。因为如果我们可以检查到给定数字的一半只是为了提高效率。
【讨论】:
【参考方案3】:start = 3
end = 50
for val in range(start, end + 1):
# If num is divisible by any number
# between 2 and val, it is not prime
if val > 1:
for n in range(2, val):
if (val % n) == 0:
break
else:
print(val)
【讨论】:
【参考方案4】:a = int(input("enter smaller no."))
b = int(input("enter larger no."))
for i in range (a,b+1):
if i>1:
for c in range(2,i):
if i%c == 0:
break
else:
print(i)
在上面的代码中,我们运行了一个从最小值到最大值的 for 循环,并将值存储在 i 中
for i in range (a,b+1):
然后我们检查存储在 i 中的数字是否大于 1,因为所有数字都可以被 1 整除,我们不想考虑它。
if i>1:
在此之后我们运行另一个循环,这次从 i 中存储的数字减少 2 到 1
for c in range(2,i):
现在我们检查存储在 i 中的数字是否可以被任何比自身小 2 到 1 的数字整除。
if i%c == 0:
如果是,那么显然它不是质数,我们打破循环。
break
如果没有,我们打印数字。
else:
print(i)
【讨论】:
【参考方案5】:对于 4,它可能不会进入 if 循环。所以我增加了 i 的范围。
print(2)
for i in range(3,51):
flag=0
for j in range(2,int(i/2)+1):
if(i%j==0):
flag=1
if(flag==0):
print(i)
【讨论】:
【参考方案6】:for i in range(3,51):
flag=0
for j in range(2,i):
if(i%j==0):
flag=1
if(flag==0):
print(i)
这打印 3 5 7 11 13 17 19 23 29 31 37 41 43 47
4%2 = 0
4%3 = 1
所以如果你从 3 开始,你会错过 4%2 = 0
【讨论】:
您能告诉我将范围更改为 (2,i) 有什么不同吗? 因为你想在你的 i%j 方程中有 2。 4%2 = 0 4%3 = 1【参考方案7】:如果你的列表有更大的数字,你应该改变
range(2,int(i/2)+1)
为
range(2,math.floor(math.sqrt(n)+1))
例如,400 将尝试直到 20 而不是 200 的数字。
【讨论】:
【参考方案8】:tryfor j in range(2,i):
数字 4 可整除是 1,2,4 如果您从 3 开始并一直持续到 4 但不是 4 您找不到任何除数,这就是为什么它将 4 视为素数的原因
【讨论】:
【参考方案9】:import math
for num in range(1,50):
if num>1:
if num==2:
print(num)
elif num%2==0:
continue
else:
for i in range(3,math.ceil(math.sqrt(num)),2):
if num%i==0:
break
else:
print(num)
它更有效,因为它避免了偶数并且还检查奇数除数直到数字的平方根,这比只检查给定数字的一半更有效
【讨论】:
以上是关于在python中打印素数的主要内容,如果未能解决你的问题,请参考以下文章