素数筛法--SPOJ Problem 2 Prime Generator
质数(prime number)又称素数,除了1和它本身外,不能整除以其他自然数,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。最小的质数是2。
要判断一个整数N是不是质数很简单,看它是否能被2到sqrt(N)之间的整数整除即可。
1 2 3 4 5 6 7 | def isPrime(n): if n % 2 = = 0 : return False for i in xrange ( 3 , int (math.sqrt(n) + 1 ), 2 ): if n % i = = 0 : return False return True |
不过要找出1到N之间的所有质数时,一个个的判定显然不是一个好主意。由于合数可以分解成一系列质数之积,所以1到N之间的合数都是1到sqrt(N)之间某个质数的倍数,排除这些合数,剩余的即为质数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import math import timeit def findPrime(n): a = [ True ] * (n + 1 ) a[ 0 ] = False a[ 1 ] = False for i in xrange ( 2 , int (math.sqrt(n) + 1 )): if a[i]: k = i * i while k< = n: a[k] = False k = k + i if __name__ = = '__main__' : t = timeit.Timer( 'findPrime(2000000)' , 'from __main__ import findPrime' ) print t.timeit( 1 ) |
算法从2开始判断是否为质数,并排除质数的倍数,当2至i都被判断后,i+1是否为质数已很明确。
SPOJ Problem 2 Prime Generator 要求找出n至m之间的质数,其中1 <= m <= n <= 1000000000, n-m<=100000。
这种情况下建一个1000000000长度的序列就太浪费空间了,需要先找出1至sqrt(n)之间的质数,然后将n与m之间这些质数的倍数排除:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import math def findPrime(n): a = [ True ] * (n + 1 ) a[ 0 ] = False a[ 1 ] = False for i in xrange ( 2 , int (math.sqrt(n) + 1 )): if a[i]: k = i * i while k< = n: a[k] = False k = k + i for i in xrange ( 2 ,n + 1 ): if a[i]: yield i def findPrimeBySeed(n,m): if n = = 1 : n = 2 seed = findPrime( int (math.sqrt(m))) alist = [ 1 ] * (m - n + 1 ) for prime in seed: if prime<n: k = (prime - n % prime) % prime else : k = 2 * prime - n while k< = m - n: alist[k] = False k + = prime for i in xrange (m - n + 1 ): if alist[i]: print i + n if __name__ = = '__main__' : line = int ( raw_input ()) for i in xrange (line): n,m = raw_input ().split() findPrimeBySeed( int (n), int (m)) print |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探