解法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)