2018-01-22 python
一、什么是素数?spa
除了1和他自己外,不能被任何数整除的整数叫素数。2是最小的素数。code
2.思路blog
好比说打印1~20内的素数class
整体归纳:由他的定义出发,第一他确定是个整数。第二就是最重要的,也就是咱们的的判断方法,假如给定一个区间,咱们怎么样去判断它是一个素数。这里的判断方法咱们确定是用一个数去除另外一个数,因此这里就出现了除数与被除数。效率
a:除数与被除数的范围 (循环)import
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
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
[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
else:
print (i)
[root@python3_ansible python]# python3 sushu1.py |head
3
5
5
5
7
7
7
7
7
9遍历
错误分析:修改完成之后,虽然可以保证全都是素数,可是这些素数每遍历一次被除数就会打印一次,咱们想要的只要他是素数就直接打印出来,而不会去遍历被除数。
这里引进一个新思路 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 |head
2
3
4
5
6
7
8
9
10
11
这样就把被除数全都打印出来了,不管你中间经历了什么,Python 只看缩进,若是最后的print(i)和第一行循环差四个空格,python 就默认为这是在遍历i的值
[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 |head
20
若是是这样,print(i)与循环并齐,打印的是循环完成之后的结果。
[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 |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.
==================================终极版==================================================
[root@python3_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)
[root@python3_ansible python]# python3 sushu2.py
3
5
7
9
11
13
15
17
19
把temp 的值赋值在循环里面,问题就解决了,i 每一次获得外层循环的一个值,temp=0.
这种方法效率特别低下,由于每个除数每取到一个值,都要遍历一遍被除数。例如除数等于5,他就要除尽2-4之间的任何一个被除数,效率
低下。
y=a*b
缩小被除数的区间
[root@python3_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)
[root@python3_ansible python]# python3 sushu3.py
5
7
9
11
13
15
17
19
[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