python中质数实现

质数:一个大于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)

在这里插入图片描述

优化后,效率最高

猜你喜欢

转载自blog.csdn.net/qq_36883141/article/details/89004473