# 斐波那契数列,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))