在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中打印素数的主要内容,如果未能解决你的问题,请参考以下文章

Python 打印素数

素数打印机停止在 251,为啥? [复制]

在打印给定范围的最后一个素数后从函数中跳出循环

Java打印素数(质数)

Python基础训练 建议学弟学妹们收藏

Python基础训练 建议学弟学妹们收藏