用了两种方法来求指定范围内的所有质数,其效率之差别令我瞠目结舌。
第一种方法是对指定范围内 3 以上所有奇数做判断,看它是否质数,是,则将它加入质数列表。
第二种方法则是先贤早就给出的“筛法”。
程序如下:
第一种方法是对指定范围内 3 以上所有奇数做判断,看它是否质数,是,则将它加入质数列表。
第二种方法则是先贤早就给出的“筛法”。
程序如下:
MAX = 100
运行结果如下:
当指定范围为 100000000 时,在我的平板电脑上运行了一个半小时没有结果,一来是我的设备配置低,二来是该算法效率低。
当指定范围为 10000000 时,第一种方法所用时间是第二种方法的 449.92/25.21 倍,求得的质数个数是 664579 个。
for i in range(6):
//方法一
MAX *= 10
print MAX
primes = [2]
from datetime import datetime
now1 = datetime.now()
import math
for n in xrange(3, MAX, 2):
end = math.sqrt(n)
for p in primes:
if p <= end:
if n % p == 0:
break
else:
primes += [n]
# print n
break
else:
# print n
primes += [n]
now2 = datetime.now()
print now2 - now1
print len(primes)
//方法二
primes = [2]
rng = range(3, MAX, 2)
now1 = datetime.now()
for n in xrange(3, int(math.sqrt(MAX)+1), 2):
if n == 0:
continue
for p in xrange(n * n, MAX, n * 2):
rng[(p - 3) / 2] = 0
for r in rng:
if r:
primes += [r]
now2 = datetime.now()
print now2 - now1
print len(primes)
print
运行结果如下:
1000
0:00:00
168
0:00:00
168
10000
0:00:00.078000
1229
0:00:00.015000
1229
100000
0:00:01.217000
9592
0:00:00.172000
9592
1000000
0:00:21.950000
78498
0:00:02.168000
78498
10000000
0:07:29.920000
664579
0:00:25.210000
664579
100000000
当指定范围为 100000000 时,在我的平板电脑上运行了一个半小时没有结果,一来是我的设备配置低,二来是该算法效率低。
当指定范围为 10000000 时,第一种方法所用时间是第二种方法的 449.92/25.21 倍,求得的质数个数是 664579 个。