用python打印素数
我试图用python打印3-50范围内的素数。代码如下:用python打印素数,python,loops,logic,Python,Loops,Logic,我试图用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) 代码运行正常,只是它也在打印4。请告知代码的逻辑是否有任何错误(忽略效率问题) 当i=4时,范围将为范围(2,2),即0。它不会进入if(i%j==0):块。因此,当i=4时,您的标志将
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)
代码运行正常,只是它也在打印4。请告知代码的逻辑是否有任何错误(忽略效率问题)
当i=4时,范围将为范围(2,2),即0。它不会进入if(i%j==0):块。因此,当i=4时,您的标志将始终为0
解决这个问题的一个方法是,如果我是4,就加上一个检查
if(flag==0 and i != 4):
编辑:正如其他人评论的那样,将范围增加1比检查值是否为4更好
for j in range(2,int(i/2)+1)
当i=4时,范围将为范围(2,2),即0。它不会进入if(i%j==0):块。因此,当i=4时,您的标志将始终为0
解决这个问题的一个方法是,如果我是4,就加上一个检查
if(flag==0 and i != 4):
编辑:正如其他人评论的那样,将范围增加1比检查值是否为4更好
for j in range(2,int(i/2)+1)
这张照片
3.
5.
7.
11
13
17
19
23
29
31
37
41
43
47
4%2=0
4%3=1
所以如果你从3开始,你会错过4%2=0
这张照片
3.
5.
7.
11
13
17
19
23
29
31
37
41
43
47
4%2=0
4%3=1
因此,如果从3开始,您将忽略4%2=0,对于4,它可能不会进入if循环。所以我增加了我的射程
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)
对于4,它可能不进入if循环。所以我增加了我的射程
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)
如果你的名单上有更大的数字,你应该改变
range(2,int(i/2)+1)
为了
例如,400将在20之前尝试数字,而不是200。如果您的列表中有更大的数字,您应该更改
range(2,int(i/2)+1)
为了
例如,400将尝试数字直到20而不是200。尝试对于范围(2,i)中的j:
如果从3开始并一直持续到4,则数字4可整除为1,2,4,但不能找到任何除数,这就是为什么它将4视为范围(2,i)中的j的素数。尝试:
如果从3开始一直到4,那么数字4可以被整除,是1,2,4,但不是4,你找不到任何除数,这就是为什么它将4视为素数的原因将范围(3,i)
更改为范围(2,i)
,因为如果我们使用范围(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,i)
更改为范围(2,i)
,因为如果我们使用范围(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)
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)
但是,更具结构性和效率的方法是使用以下各项:-
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
我们不需要检查除所有数字,直到数本身为素数。因为如果我们能检查到给定数字的一半,只为了提高效率
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)
在上面的代码中,我们从最小值到最大值运行for循环,并将值存储在i中
for i in range (a,b+1):
然后我们检查存储在i中的数字是否大于1,因为所有的数字都可以被1整除,我们不想考虑它。
if i>1:
在此之后,我们运行另一个循环,这次是从2到1,比i中存储的数字少
for c in range(2,i):
现在,我们检查存储在i中的数字是否可以被2到1中的任何一个数字整除
if i%c == 0:
如果是,那么很明显,它不是一个素数,我们打破了循环
break
如果没有,我们打印号码
else:
print(i)
在上面的代码中,我们从最小值到最大值运行for循环,并将值存储在i中
for i in range (a,b+1):
然后我们检查存储在i中的数字是否大于1,因为所有的数字都可以被1整除,我们不想考虑它。
if i>1:
在此之后,我们运行另一个循环,这次是从2到1,比i中存储的数字少
for c in range(2,i):
现在,我们检查存储在i中的数字是否可以被2到1中的任何一个数字整除
if i%c == 0:
如果是,那么很明显,它不是一个素数,我们打破了循环
break
如果没有,我们打印号码
else:
print(i)
对于
i=4
,在(2,2)
范围内运行j
,该范围为空。如果你将端点增加1,你会发现一个因子。正如@khelwood建议的那样,将范围(2,int(i/2))中j的行更改为范围(2,int(i/2)+1)中j的,
它应该可以工作。请检查编辑的版本,它仍然给我4作为输出,我说增加端点。我没说增加起点。如果你从3开始你的射程,你仍然错过了2。如果我从3开始j有什么问题?请参考之前错误发布的代码的编辑版本…对于i=4
,您在(2,2)
范围内运行j
,该范围为空。如果你将端点增加1,你会发现一个因子。正如@khelwood建议的那样,将范围(2,int(i/2))中j的行更改为范围(2,int(i/2)+1)中j的,
它应该可以工作。请检查编辑的版本,它仍然给我4作为输出,我说增加端点。我没说增加起点。如果你从3开始你的射程,你仍然错过了2。如果我从3开始j有什么问题?请参考之前错误发布的代码的编辑版本…您能告诉我将范围更改为(2,i)有什么区别吗?因为您希望在i%j等式中有2。4%2=0 4%3=1你能告诉我把范围改成(2,i)有什么区别吗?因为你想在i%j方程中有2。4%2=0 4%3=1最好解释代码。最好解释代码。