天天看点

python打印一定范围内的素数_python(8) ======== 打印一个范围内的素数

[[email protected]_ansible python]# cat sushu.py

#!/usr/bin/python3for i in range(2,21):for j in range(2,i-1):if i%j == 0:continue

else:

print (i)

[[email protected]_ansible python]# python3 sushu.py |head

5

5

6

7

7

7

7

8

8

8

错误分析:

被除数范围错误:比如说除数是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

[[email protected]_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

else:

print (i)

[[email protected]_ansible python]# python3 sushu1.py |head

3

5

5

5

7

7

7

7

7

9

错误分析:修改完成以后,虽然能够保证全都是素数,但是这些素数每遍历一次被除数就会打印一次,我们想要的只要他是素数就直接打印出来,而不会去遍历被除数。

这里引进一个新思路 flag

在看flag 之前看下python 的缩进引发的问题,如果代码是这样的会有怎样的结果

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu1.py |head

2

3

4

5

6

7

8

9

10

11

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

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu1.py |head

20

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

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu2.py |head

3

4

5

6

7

8

9

10

11

12

在Python中变量的初始值必须被定义,这个的错误原因是因为变量被赋值了一次;以i=4 为例,紧接着上一次循环,i=3的打印结束的时候,

temp=1;所以当i=4的时候,temp依然等于1;4%2虽然等于0,结束了内层循环,但temp的值依然等于1,打印i=4.

==================================终极版==================================================

[[email protected]_ansible python]# cat sushu2.py

#!/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)

[[email protected]_ansible python]# python3 sushu2.py

3

5

7

9

11

13

15

17

19

把temp 的值赋值在循环里面,问题就解决了,i 每一次得到外层循环的一个值,temp=0.

这种方法效率特别低下,因为每一个除数每取到一个值,都要遍历一遍被除数。例如除数等于5,他就要除尽2-4之间的任何一个被除数,效率

低下。

y=a*b

缩小被除数的区间

[[email protected]_ansible python]# cat sushu3.py

#!/usr/bin/python3

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)

[[email protected]_ansible python]# python3 sushu3.py

5

7

9

11

13

15

17

19

[[email protected]_ansible python]# cat sushu4.py

#!/usr/bin/python3

import math

for 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)

[[email protected]_ansible python]# python3 sushu4.py

3

5

7

9

11

13

15

17

19