Python -- 如何求素(质)数

解法1:
简单算法
一个数能被从2开始到自己的平方根的正整数整除,就是合数

#import  datetime
#start = datetime.datetime.now()
n = 100000
count = 0
for x in range(2, n):
    for i in range(2, int(x ** 0.5) + 1): # int()表示向下取正整数
        if x % i == 0:   
            break
    else:
        count += 1
        # print(x)
#delta = (datetime.datetime.now()- start).total_seconds()
#print(delta)# 0.42
print(count)# 9592

解法2:
使用奇数

#import  datetime
#start = datetime.datetime.now()
n =100000
count =1
for x in range(3, n, 2):# 2以后所有的偶数都为合数,所以先把偶数筛选掉
    for i in range(3, int(x ** 0.5)+1,2): # 既然是奇数,就没有必要偶数取模
        if x % i ==0:
            break
    else:
        count += 1
        #print(x)
#delta = (datetime.datetime.now()- start).total_seconds()
#print(delta) #0.216
print(count) #9592

解法3:
存储质数 合数一定可以分解为几个质数的乘积,2是质数
质数一定不能整除1和本身之内的整数

#import  datetime
#start = datetime.datetime.now()
n =100000
count = 1
primenubers = [2]

for x in range(3, n ,2):# 大于2质数只可能是奇数
    flag = False # 不是素数
    edge = int(x ** 0.5) #每一次x循环计算一次
    for i in primenubers:
        if  i > edge: # 素数  # if i >int(x ** 0.5),如果将上述公式放在这里,每一次i循环都会计算一次,大大增加了时间复杂度
            flag = True
            break
        if x % i == 0 : #合数
            flag = False
            break
    if flag:
        primenubers.append(x)
        count +=1
#delta = (datetime.datetime.now()- start).total_seconds()
#print(primenubers)
#print(delta) # 0.163
print(count) #9592

解法4:
孪生素数性质
大于3的素数只有6N-1和6N+1两种形式,如果6N-1和6N+1都是素数则称为孪生素数
注意,其实测试的都是6的倍数的前后的数字,而这些数字一定是奇数

# import  datetime
# start = datetime.datetime.now()
n = 100000
count = 3
x = 7
step = 4
primeList = [3]
while x < n :
    if x % 5 != 0:
        for i in primeList:
            if x % i == 0:
                break
        else:
            primeList.append(x)
            count += 1
    x += step
    step = (4 if step == 2 else 2)

#print(count)
#primeList.insert(0, 2)
#primeList.insert(2, 5)
#print(primeList, len(primeList))
#delta = (datetime.datetime.now()- start).total_seconds()
#print(delta)
print(count)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值