python练习(3)——菲波那切数列,求10万以内素数优化

本文提供了一种高效的素数筛选算法及斐波那契数列生成方法。通过采用筛法来找出10万以内的所有素数,并使用简单的迭代法计算斐波那契数列第100项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 斐波那契数列,a,b = b,a+b
first = 0
second = 1
cnt = 2
for i in range(101-2):
    mid = first + second
    cnt += 1
    first = second
    second = mid
print(mid)

 

# 素数

# 求10万以内所有的素数,优化,筛法

ceil(sqrt)开方后向上取整,一个数分解质因数,开方是中间位置

计算放到循环外面,跳步,判断和赋值效率最高

筛法只用到判断和赋值,所以效率很高

# 列表+孪生素数 大于3的素数只分布在6n-1和6n+1两数列中

import math
import datetime
n = 100000
begin = datetime.datetime.now()
lst = [2,3]
foo = 5
step = 2
while True:
    point = math.ceil(math.sqrt(foo))
    for i in lst:
        if not foo % i:
            break
        if i >= point:          # 大于中间点就不用判断了
            lst.append(foo)
            break
    foo += step
    if foo > n:
        break
    step = 4 if step == 2 else 2
delta = (datetime.datetime.now()-begin).total_seconds()
print(delta)
print(len(lst))
print('-'*50)
# 筛法(列表索引记录值,value记录是否为素数,素数的倍数都不是素数)
begin = datetime.datetime.now()
supPrimes = [True]*(n+1)
supPrimes[0] = False
supPrimes[1] = False
point = math.ceil(math.sqrt(n))
for i in range(2,point):
    if not supPrimes[i]:
        continue
    else:
        for j in range(i*i,n+1,i):
            supPrimes[j] = False
primes = [i for i in range(n+1) if supPrimes[i]]
delta = (datetime.datetime.now()-begin).total_seconds()
print(delta)
print(len(primes))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值