python教程:打印一个范围内的素数

1、什么是素数?

除了1和他本身外,不能被任何数整除的整数叫素数。2是最小的素数。

2.思路

比如说打印1~20内的素数

总体概括:由他的定义出发,第一他肯定是个整数。第二就是最重要的,也就是我们的的判断方法,假如给定一个区间,我们怎么样去判断它是一个素数。这里的判断方法我们肯定是用一个数去除另一个数,所以这里就出现了除数与被除数。

a:除数与被除数的范围 (循环)

b:除数/被除数可以整除。。。。。,不可以整除。。。。(判断)

[root@python3_ansible python]# cat sushu.py 
#!/usr/bin/python3

for i in range(2,21):
    for j in range(2,i-1):
        if i%j == 0:
            continue
        else:
            print (i)
[root@python3_ansible python]# python3 sushu.py |head 5567777888

错误分析:
被除数范围错误:比如说除数是5,被除数的取值范围应该是2-4,而在Python中2-4的表示应该为(2,5)
逻判断错误:如果是i=5;按照上面的写法,j=2 j=3;5%2 != 0 print 5 ;5%3 != 0 print 5; 如果说i=6;按照上面的写法,j=2 j=3 j=4 ; 6%2 = 0 continue ;6%3 = 0 continue ;6%4 != 0 print 6这里显然是不对的,如果这里使用continue,如果除数遇到可以整除的被除数,只是将可以整除的被除数跳过,还是会遍历完不能整除的被除数。这个地方改成break

[root@python3_ansible python]# cat sushu1.py #!/usr/bin/python3
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for i in range(2,21):
   for j in range(2,i):
        if i%j == 0:
           break
        else:  
           print (i) 
[root@python3_ansible python]# python3 sushu1.py |head3555777779

错误分析:修改完成以后,虽然能够保证全都是素数,但是这些素数每遍历一次被除数就会打印一次,我们想要的只要他是素数就直接打印出来,而不会去遍历被除数。
这里引进一个新思路 flag
在看flag 之前看下python 的缩进引发的问题,如果代码是这样的会有怎样的结果

[root@python3_ansible python]# cat sushu1.py #!/usr/bin/python3
for i in range(2,21):
    for j in range(2,i):
        if i%j == 0:
           break       
    print (i) 
[root@python3_ansible python]# python3 sushu1.py |head234567891011

这样就把被除数全都打印出来了,无论你中间经历了什么,Python 只看缩进,如果最后的print(i)和第一行循环差四个空格,python 就默认为这是在遍历i的值

[root@python3_ansible python]# cat sushu1.py #!/usr/bin/python3
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for i in range(2,21):
    for j in range(2,i):
        if i%j == 0:
           break 
    print (i) 
[root@python3_ansible python]# python3 sushu1.py |head20

如果是这样,print(i)与循环并齐,打印的是循环完成以后的结果。

扫描二维码关注公众号,回复: 11881533 查看本文章
[root@python3_ansible python]# cat sushu2.py 
#!/usr/bin/python3
temp = 0
for i in range(2,21):
#    temp = 0
    for j in range(2,i):        
        if i%j == 0:       
           break        
        else:       
           temp = 1  
    if temp == 1: 
        print (i)
[root@python3_ansible python]# python3 sushu2.py |head3456789101112

在Python中变量的初始值必须被定义,这个的错误原因是因为变量被赋值了一次;以i=4 为例,紧接着上一次循环,i=3的打印结束的时候,temp=1;所以当i=4的时候,temp依然等于1;4%2虽然等于0,结束了内层循环,但temp的值依然等于1,打印i=4.
-----------------------终极版----------------------------------------------

[root@python3_ansible python]# cat sushu2.py 
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/usr/bin/python3
for i in range(2,21):
    temp = 0  
    for j in range(2,i):     
       if i%j == 0:            
           break        
       else:        
           temp = 1 
       if temp == 1:    
           print (i)
[root@python3_ansible python]# python3 sushu2.py 35791113151719

把temp 的值赋值在循环里面,问题就解决了,i 每一次得到外层循环的一个值,temp=0.这种方法效率特别低下,因为每一个除数每取到一个值,都要遍历一遍被除数。例如除数等于5,他就要除尽2-4之间的任何一个被除数,效率低下。y=a*b缩小被除数的区间

[root@python3_ansible python]# cat sushu3.py #!/usr/bin/python3
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for i in range(2,21):  
  temp = 0  
  x = int(i/2)   
  for j in range(2,x+1):     
     if i%x == 0:        
       break       
     else:          
       temp = 1   
  if temp == 1:       
      print(i)
[root@python3_ansible python]# python3 sushu3.py 5791113151719
[root@python3_ansible python]# cat sushu4.py 
#!/usr/bin/python3
import mathfor i in range(2,21):  
  temp = 0  
  x = int(math.sqrt(i))   
  for j in (2,x+1):  
     if i%j == 0:       
       break   
     else:       
       temp = 1   
   if temp == 1:       
    print(i)
[root@python3_ansible python]# python3  sushu4.py 35791113151719

猜你喜欢

转载自blog.csdn.net/sinat_38682860/article/details/108962873