质数:一个大于1的自然数,除了1和它本身不能被其它数整除
算法一
- 简单算法,按照定义来实现
import datetime #引用时间模块
start=datetime.datetime.now() #显示程序开始时时间
count=0
n=10000 #10000以内的数字
for i in range(2,10000):
for j in range(2,i):
if i%j==0:
break
else:
print(i)
count+=1
delta=(datetime.datetime.now()-start).total_seconds()
print(start)
print(delta) #显示程序结束时时间
print(count) #素数个数
直接按照定义来实现效率很低
算法二
- 偶数除了2都不是素数
import datetime
start=datetime.datetime.now()
count=1
n=10000 #10000以内的数字
for i in range(3,10000,2):
for j in range(3,i,2):
if i%j==0:
break
else:
print(i)
count+=1
delta=(datetime.datetime.now()-start).total_seconds()
print(start)
print(delta)
print(count)
去除偶数相当于去掉一半运算量,效率提高差不多一半
算法三
- 所有大于10的质数中,个位数只有1,3,7,9
import datetime
start=datetime.datetime.now()
count=1
n=10000 #10000以内的数字
for i in range(3,10000,2):
if i>10 and i%10==5: #或者 i>10 and i%5==0
continue
for j in range(3,i,2):
if i%j==0:
break
else:
# print(i)
count+=1
delta=(datetime.datetime.now()-start).total_seconds()
print(start)
print(delta)
print(count)
加上这个排除条件之后效率又有所提高
算法四
- 例如像15、33、39等这样的数字被称为合数,合数是由两个质数相乘得出的所以只需要计算到一半就可以排除了,同理可知其他数字也适用这一条件
import datetime
start=datetime.datetime.now()
count=1
n=10000 #10000以内的数字
for i in range(3,10000,2):
if i>10 and i%10==5:
continue
for j in range(3,int(i**0.5)+1,2): #只需要计算一半就可以了
if i%j==0:
break
else:
# print(i)
count+=1
delta=(datetime.datetime.now()-start).total_seconds()
print(start)
print(delta)
print(count)
相当于去掉了一半的计算量,效率又很大程度上提高了。
算法五
- 合数一定可以分解为几个质数的乘积
- 质数一定不能整除1和本身之外的整数
- 用列表实现
import datetime
start=datetime.datetime.now()
count=1
n=10000
primenumber=[3]
for i in range(3,10000,2):
if i>10 and i%10==5:
continue
for j in primenumber: #在质数表中选取数字
if i%j==0: #能整除的是和数
break
else:
# print(i)
count+=1
primenumber.append(i)
delta=(datetime.datetime.now()-start).total_seconds()
print(start)
print(delta)
print(count)
用普通列表实现效率很低,需要优化
算法六
- 合数一定可以分解为几个质数的乘积
- 质数一定不能整除1和本身之外的整数
- 用列表实现
- 进一步优化
import datetime
start=datetime.datetime.now()
count=1
n=10000
primenumber=[3]
for i in range(3,10000,2):
flag=False
if i>10 and i%10==5:
continue
for j in primenumber:
if j>int(i**0.5): #是质数
flag=True
break
if i%j==0: #是合数
flag=False
break
if flag:
# print(i)
count+=1
primenumber.append(i)
delta=(datetime.datetime.now()-start).total_seconds()
print(start)
print(delta)
print(count)
优化后,效率最高